def explode_ringed_firework(self, prev_emitter): """Actions that happen when a firework shell explodes, resulting in a ringed firework""" self.emitters.append(make_puff(prev_emitter)) self.emitters.append(make_flash(prev_emitter)) spark_texture, ring_texture = random.choice(SPARK_PAIRS) sparks = arcade.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(25), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 8.0), lifetime=random.uniform(0.55, 0.8), mutation_callback=firework_spark_mutator)) self.emitters.append(sparks) ring = arcade.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(20), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=ring_texture, change_xy=arcade.rand_on_circle( (0.0, 0.0), 5.0) + arcade.rand_in_circle((0.0, 0.0), 0.25), lifetime=random.uniform(1.0, 1.6), mutation_callback=firework_spark_mutator)) self.emitters.append(ring)
def make_gun_fire_emitter(self): """ Function to create a firing particle effect for when the tank fires. Currently is set to match the location and orientation of the tank. If the tank is moving rapidly, it looks a little silly at the moment, but to fix that I'd have to update the emitter position on update and I'm not sure that is worth it. Inputs: None Outputs: (emitter obj): tank tread particle """ front_x = self.player.center_x + ( self.player.width / 2 + self.t_shot.height / 2 + 5 ) * np.cos(self.player.radians) front_y = self.player.center_y + ( self.player.height / 2 + self.t_shot.height / 2 + 5 ) * np.sin(self.player.radians) return arcade.Emitter( center_xy=(front_x, front_y), emit_controller=arcade.EmitBurst(1), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=self.t_shot, angle=self.player.angle + 90, # correcting for texture orientation change_xy=(0, 0), lifetime=0.4, scale=1, ), )
def make_flash(prev_emitter): """Return emitter that displays the brief flash when a firework shell explodes""" return arcade.Emitter(center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(3), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=FLASH_TEXTURE, change_xy=arcade.rand_in_circle((0.0, 0.0), 3.5), lifetime=0.15))
def make_puff(prev_emitter): """Return emitter that generates the subtle smoke cloud left after a firework shell explodes""" return arcade.Emitter( pos=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(4), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=PUFF_TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), 0.4) + Vec2d(0.3, 0.0), lifetime=4.0))
def make_puff(prev_emitter): """Return emitter that generates the subtle smoke cloud left after a firework shell explodes""" return arcade.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(4), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=PUFF_TEXTURE, change_xy=(_Vec2(arcade.rand_in_circle( (0.0, 0.0), 0.4)) + _Vec2(0.3, 0.0)).as_tuple(), lifetime=4.0))
def create_emitter(self): spark_texture = random.choice(SPARK_TEXTURES) self.emitter = arcade.Emitter( #center_xy=prev_emitter.get_pos(), center_xy=(500, 500), emit_controller=arcade.EmitBurst(random.randint(30, 40)), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0), lifetime=random.uniform(0.5, 1.2), mutation_callback=firework_spark_mutator))
def heart_poof(position): return arcade.Emitter( center_xy=(position.x, position.y), emit_controller=arcade.EmitBurst(50), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=arcade.load_texture(HEART_FULL), change_xy=arcade.rand_in_circle((0.0, 0.0), 1.0), lifetime=1.5, scale=0.1 * random.random(), ), )
def emitter_9(): """Burst, emit from center, velocity in fixed angle and random speed""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_vec_magnitude(45, 1.0, 4.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_9.__doc__, e
def emitter_1(): """Burst, emit from center, particle lifetime 1.0 seconds""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=1.0, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_1.__doc__, e
def emitter_11(): """Burst, emit from center, velocity along a line""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_on_line(Vec2d(-2, 1), Vec2d(2, 1)), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_11.__doc__, e
def emitter_7(): """Burst, emit from center, velocity fixed speed around 360 degrees""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_on_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_7.__doc__, e
def emitter_0(): """Burst, emit from center, particle with lifetime""" e = arcade.Emitter(center_xy=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=arcade.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_0.__doc__, e
def emitter_8(): """Burst, emit from center, velocity in rectangle""" e = arcade.Emitter(center_xy=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=arcade.rand_in_rect( (-2.0, -2.0), 4.0, 4.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_8.__doc__, e
def emitter_10(): """Burst, emit from center, velocity from angle with spread""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_vec_spread_deg(90, 45, 2.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_10.__doc__, e
def emitter_3(): """Burst, emit in circle""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, pos=arcade.rand_in_circle(Vec2d.zero(), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_3.__doc__, e
def emitter_34(): """Dynamically generated textures, burst emitting, fading particles""" textures = [arcade.make_soft_circle_texture(48, p) for p in (arcade.color.GREEN, arcade.color.BLUE_GREEN)] e = arcade.Emitter( center_xy=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=random.choice(textures), change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE ) ) return emitter_34.__doc__, e
def emitter_0(self): """Burst, emit from center, particle with lifetime""" e = arcade.Emitter( center_xy=(self.sprite.center_x, self.sprite.center_y), emit_controller=arcade.EmitBurst(constants.BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=self.burst_texture, change_xy=arcade.rand_in_circle( (0.0, 0.0), constants.PARTICLE_SPEED_FAST), lifetime=random.uniform( constants.DEFAULT_PARTICLE_LIFETIME - 1.0, constants. DEFAULT_PARTICLE_LIFETIME), scale=constants.DEFAULT_SCALE, alpha=constants.DEFAULT_ALPHA)) return e
def emitter_6(): """Burst, emit on line""" e = arcade.Emitter( center_xy=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, center_xy=arcade.rand_on_line((0.0, 0.0), (SCREEN_WIDTH, SCREEN_HEIGHT)), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA ) ) return emitter_6.__doc__, e
def emitter_5(): """Burst, emit in rectangle""" width, height = 200, 100 centering_offset = Vec2d(-width / 2, -height / 2) e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, pos=arcade.rand_in_rect(centering_offset, width, height), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_5.__doc__, e
def explode_firework(self, prev_emitter): """Actions that happen when a firework shell explodes, resulting in a typical firework""" self.emitters.append(make_puff(prev_emitter)) self.emitters.append(make_flash(prev_emitter)) spark_texture = random.choice(SPARK_TEXTURES) sparks = arcade.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(random.randint(30, 40)), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0), lifetime=random.uniform(0.5, 1.2), mutation_callback=firework_spark_mutator)) self.emitters.append(sparks)
def bee_poof(position): return arcade.Emitter( center_xy=(position.x, position.y), emit_controller=arcade.EmitBurst(50), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=random.choice( [ arcade.load_texture("data/kenney_particlePack_1.1/light_01.png"), arcade.load_texture("data/kenney_particlePack_1.1/light_02.png"), arcade.load_texture("data/kenney_particlePack_1.1/light_03.png"), ] ), change_xy=arcade.rand_in_circle((0.0, 0.0), 1.0), lifetime=1.5, scale=0.1 * random.random(), ), )
def make_sparks(self, position): spark_texture = random.choice(SPARK_TEXTURES) sparks = arcade.Emitter( center_xy=position, emit_controller=arcade.EmitBurst(self.radius), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0), start_alpha=255, duration1=random.uniform(0.6, 1.0), mid_alpha=0, duration2=random.uniform(0.1, 0.2), end_alpha=255, mutation_callback=firework_spark_mutator ) ) self.emitters.append(sparks)
def player_gets_hit(self): """ Function to turn the player red when it gets hit Inputs: None Outputs: """ return arcade.Emitter( center_xy=(self.player.center_x, self.player.center_y), emit_controller=arcade.EmitBurst(1), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=self.t_hit, angle=self.player.angle, change_xy=(0, 0), lifetime=0.4, scale=1, ), )
def explode_sparkle_firework(self, prev_emitter): """Actions that happen when a firework shell explodes, resulting in a sparkling firework""" self.emitters.append(make_puff(prev_emitter)) self.emitters.append(make_flash(prev_emitter)) spark_texture = random.choice(SPARK_TEXTURES) sparks = arcade.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcade.EmitBurst(random.randint(30, 40)), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0), start_alpha=255, duration1=random.uniform(0.6, 1.0), mid_alpha=0, duration2=random.uniform(0.1, 0.2), end_alpha=255, mutation_callback=firework_spark_mutator)) self.emitters.append(sparks)
def draw_treads(self): """ Function to create treads particle effect for when the tank moves. Currently is set to match the location and orientation of the tank. Inputs: None Outputs: (emitter obj): tank tread particle """ return arcade.Emitter( center_xy=(self.player.center_x, self.player.center_y), emit_controller=arcade.EmitBurst(1), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=self.t_tread, angle=self.player.angle + 90, change_xy=(0, 0), lifetime=0.4, scale=0.5, ), )
def __init__(self, center_pos, velocity=None): self.emitter_timeout = 0 if velocity: self.speed = PARTICLE_SPEED_FAST + velocity.speed else: self.speed = PARTICLE_SPEED_FAST self.frametime_plotter = FrametimePlotter() self.emitter = arcade.Emitter( center_xy=center_pos, emit_controller=arcade.EmitBurst(BURST_PARTICLE_COUNT), # emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcade.rand_on_circle((0.0, 0.0), self.speed), lifetime=random.uniform(DEFAULT_PARTICLE_LIFETIME - 0.5, DEFAULT_PARTICLE_LIFETIME), #lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA ) )
def create_emitter(self): ww, wh = arcade.get_window().get_size() spark_texture = random.choice(SPARK_TEXTURES) def firework_spark_mutator(particle: arcade.FadeParticle): """mutation_callback shared by all fireworks sparks""" # gravity particle.change_y += -0.03 # drag particle.change_x += self.change particle.change_y += self.change self.emitter = arcade.Emitter( center_xy=(ww / 2, wh / 2), emit_controller=arcade.EmitBurst(random.randint(30, 40)), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=spark_texture, change_xy=arcade.rand_in_circle((0.0, 0.0), 9.0), lifetime=random.uniform(0.5, 1.2), mutation_callback=firework_spark_mutator))
def make_burst_emitter(center_xy: Point, filenames_and_textures: List[FilenameOrTexture], particle_count: int, particle_speed: float, particle_lifetime_min: float, particle_lifetime_max: float, particle_scale: float = 1.0, fade_particles: bool = True): """Returns an emitter that emits all of its particles at once""" particle_factory = arcade.LifetimeParticle if fade_particles: particle_factory = arcade.FadeParticle return arcade.Emitter( center_xy=center_xy, emit_controller=arcade.EmitBurst(particle_count), particle_factory=lambda emitter: particle_factory( filename_or_texture=random.choice(filenames_and_textures), change_xy=arcade.rand_in_circle((0.0, 0.0), particle_speed), lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max), scale=particle_scale))
def make_burst_emitter( pos: Vec2d, filenames_and_textures: List[ str], # Also supports Texture objects in the List particle_count: int, particle_speed: float, particle_lifetime_min: float, particle_lifetime_max: float, particle_scale: float = 1.0, fade_particles: bool = True): """Returns an emitter that emits all of its particles at once""" particle_factory = arcade.LifetimeParticle if fade_particles: particle_factory = arcade.FadeParticle return arcade.Emitter( pos=pos, emit_controller=arcade.EmitBurst(particle_count), particle_factory=lambda emitter: particle_factory( filename_or_texture=random.choice(filenames_and_textures), vel=arcade.rand_in_circle(Vec2d.zero(), particle_speed), lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max), scale=particle_scale))
def make_boom(self, x, y): """ Function to return a shortlived burst emitter whenever we want. Potentially I could have had this appended directly to the emitter list, but instead I return the emitter itself and will have to add it to the list after that. Inputs: x (float): the center x position of the burst y (float): the center y position of the burst Outputs: (emitter object): circular green burst of spinning square particles """ return arcade.Emitter( center_xy=(x, y), emit_controller=arcade.EmitBurst(100), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=self.text_green, change_xy=arcade.rand_in_circle((0, 0), 10), change_angle=10, lifetime=3, scale=0.5, ), )