def make_interval_emitter( pos: Vec2d, filenames_and_textures: List[ str], # Also supports Texture objects in the List emit_interval: float, emit_duration: float, 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 its particles at a constant rate for a given amount of time""" particle_factory = arcade.LifetimeParticle if fade_particles: particle_factory = arcade.FadeParticle return arcade.Emitter( pos=pos, emit_controller=arcade.EmitterIntervalWithTime(emit_interval, emit_duration), particle_factory=lambda emitter: particle_factory( filename_or_texture=random.choice(filenames_and_textures), vel=arcade.rand_on_circle(Vec2d.zero(), particle_speed), lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max), scale=particle_scale))
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 emitter_27(): """Maintain a steady count of particles""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitMaintainCount(3), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_on_circle(Vec2d.zero(), 2.0), lifetime=random.uniform(1.0, 3.0), )) return emitter_27.__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_20(): """Interval, emit from center, velocity fixed speed around 360 degrees""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), 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_20.__doc__, e
def emitter_4(): """Burst, emit on 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_on_circle(Vec2d.zero(), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_4.__doc__, e
def emitter_17(): """Interval, emit on circle""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), 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_on_circle(Vec2d.zero(), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_17.__doc__, e
def _createWarpEffectEmitter(self) -> Emitter: """ Random particle textures """ texture0 = self._warpEffectTextures[0] texture2 = self._warpEffectTextures[2] e: Emitter = Emitter( center_xy=self._centerPosition, emit_controller=EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: LifetimeParticle( filename_or_texture=randomChoice((texture0, texture2)), change_xy=rand_on_circle((0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE ) ) return e
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 make_interval_emitter(center_xy: Point, filenames_and_textures: List[FilenameOrTexture], emit_interval: float, emit_duration: float, 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 its particles at a constant rate for a given amount of time""" particle_factory = arcade.LifetimeParticle if fade_particles: particle_factory = arcade.FadeParticle return arcade.Emitter( center_xy=center_xy, emit_controller=arcade.EmitterIntervalWithTime(emit_interval, emit_duration), particle_factory=lambda emitter: particle_factory( filename_or_texture=random.choice(filenames_and_textures), change_xy=arcade.rand_on_circle((0.0, 0.0), particle_speed), lifetime=random.uniform(particle_lifetime_min, particle_lifetime_max), scale=particle_scale))
def test_rand_on_circle(): """Smoke test""" arcade.rand_on_circle((10.0, 20.0), 15.5)