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_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_16(): """Interval, emit in 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_in_circle(Vec2d.zero(), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_16.__doc__, e
def __init__(self): super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # Set the working directory (where we expect to find files) to the same # directory this .py file is in. You can leave this out of your own # code, but it is needed to easily run the examples using "python -m" # as mentioned at the top of this program. file_path = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_path) arcade.set_background_color(arcade.color.BLACK) self.emitters = [] self.frametime_plotter = FrametimePlotter() self.launch_firework(0) arcade.schedule(self.launch_spinner, 4.0) stars = arcade.Emitter( center_xy=(0.0, 0.0), emit_controller=arcade.EmitMaintainCount(20), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=random.choice(STAR_TEXTURES), change_xy=(0.0, 0.0), start_alpha=0, duration1=random.uniform(2.0, 6.0), mid_alpha=128, duration2=random.uniform(2.0, 6.0), end_alpha=0, center_xy=arcade.rand_in_rect((0.0, 0.0), SCREEN_WIDTH, SCREEN_HEIGHT) ) ) self.emitters.append(stars) self.cloud = arcade.Emitter( center_xy=(50, 500), change_xy=(0.15, 0), emit_controller=arcade.EmitMaintainCount(60), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=random.choice(CLOUD_TEXTURES), change_xy=(_Vec2(arcade.rand_in_circle((0.0, 0.0), 0.04)) + _Vec2(0.1, 0)).as_tuple(), start_alpha=0, duration1=random.uniform(5.0, 10.0), mid_alpha=255, duration2=random.uniform(5.0, 10.0), end_alpha=0, center_xy=arcade.rand_in_circle((0.0, 0.0), 50) ) ) self.emitters.append(self.cloud)
def create_emitter(self): self.emitter = arcade.Emitter( center_xy=(500, 500), change_xy=(0.15, 0), emit_controller=arcade.EmitMaintainCount(60), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=random.choice(CLOUD_TEXTURES), change_xy=(_Vec2(arcade.rand_in_circle((0.0, 0.0), 0.04)) + _Vec2(0.1, 0)).as_tuple(), start_alpha=0, duration1=random.uniform(5.0, 10.0), mid_alpha=255, duration2=random.uniform(5.0, 10.0), end_alpha=0, center_xy=arcade.rand_in_circle((0.0, 0.0), 50) ) )
def emitter_36(): """Moving emitter. Particles spawn relative to emitter.""" class MovingEmitter(arcade.Emitter): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.elapsed = 0.0 def update(self): super().update() self.elapsed += 1 / 60 self.center_x = sine_wave(self.elapsed, 0, SCREEN_WIDTH, SCREEN_WIDTH / 100) self.center_y = sine_wave(self.elapsed, 0, SCREEN_HEIGHT, SCREEN_HEIGHT / 100) e = MovingEmitter( center_xy=CENTER_POS, emit_controller=arcade.EmitInterval(0.005), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=TEXTURE, change_xy=arcade.rand_in_circle((0.0, 0.0), 0.1), lifetime=random.uniform(1.5, 5.5), scale=random.uniform(0.05, 0.2) ) ) return emitter_36.__doc__, e
def createParticleBurst(x0, y0, partInterval, totalDuration, partSize, partScale, partSpeed, color, startAlpha, endAlpha, imagePath=None): e = arcade.Emitter( center_xy=(x0, y0), emit_controller=arcade.EmitterIntervalWithTime(partInterval, totalDuration), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=imagePath if imagePath is not None else arcade.make_circle_texture( partSize, color), change_xy=arcade.rand_in_circle((0.0, 0.0), partSpeed), scale=partScale, lifetime=uniform(totalDuration / 4, totalDuration), start_alpha=startAlpha, end_alpha=endAlpha, ), ) return e
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 emitter_12(): """Infinite emitting w/ eternal particle""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitInterval(0.02), particle_factory=lambda emitter: arcade.EternalParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_12.__doc__, e
def make_emitter(): return arcade.Emitter(center_xy=(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2), emit_controller=arcade.EmitterIntervalWithTime( 0.0004, 15.0), particle_factory=lambda emitter: arcade. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=arcade.rand_in_circle( (0.0, 0.0), 5.0), lifetime=1.0, scale=0.5, alpha=128))
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_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_26(): """Interval, emit particles every 0.4 seconds and stop after emitting 5""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithCount(0.4, 5), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=0.6, alpha=128)) return emitter_26.__doc__, e
def emitter_33(): """Particles that fade over time""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.FadeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE)) return emitter_33.__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_28(): """random particle textures""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=random.choice((TEXTURE, TEXTURE2, TEXTURE3)), vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE)) return emitter_28.__doc__, e
def emitter_13(): """Interval, emit particle every 0.01 seconds for one second""" e = arcade.Emitter(center_xy=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), 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_13.__doc__, e
def emitter_31(): """Constant particle angle""" e = arcade.Emitter(center_xy=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade. LifetimeParticle(filename_or_texture=TEXTURE2, change_xy=arcade.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, angle=45, scale=DEFAULT_SCALE)) return emitter_31.__doc__, e
def emitter_14(): """Interval, emit from center, particle lifetime 1.0 seconds""" 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_FAST), lifetime=1.0, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_14.__doc__, e
def emitter_32(): """animate particle angle""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE2, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, change_angle=2, scale=DEFAULT_SCALE)) return emitter_32.__doc__, e
def emitter_30(): """random particle alpha""" e = arcade.Emitter( pos=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, vel=arcade.rand_in_circle(Vec2d.zero(), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=random.uniform(32, 128))) return emitter_30.__doc__, e
def emitter_29(): """random particle scale""" e = arcade.Emitter(center_xy=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), 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=random.uniform(0.1, 0.8), alpha=DEFAULT_ALPHA)) return emitter_29.__doc__, e
def __init__(self): self.w = 600 self.h = 600 arcade.Window.__init__(self, self.w, self.h, "Particles!") arcade.set_background_color(arcade.color.EERIE_BLACK) # Sprite for particle from image (try changing to other item numbers! 17 is hearts!) self.text_blue = arcade.load_texture( "Sprites/PNG/Items/platformPack_item001.png") # Sprite for particle pregenerated self.text_red = arcade.make_soft_circle_texture(20, arcade.color.RED) self.text_green = arcade.make_soft_square_texture( 50, arcade.color.GREEN, 200, 150) # Timer for cosine/sine purposes later self.timer = 0 # Empty list to store our emitters for easy drawing and updating self.emitters = [] # Make the center, moving emitter self.fountain = arcade.Emitter( center_xy=(self.w / 2, self.h / 2), # Position emit_controller=arcade.EmitInterval( 0.01), # When to make more particles particle_factory=lambda emitter: arcade. FadeParticle( # Type of particle filename_or_texture=self.text_blue, # Particle texture change_xy=arcade.rand_in_circle( (0, 0), 4.5), # Particle velocity lifetime=1.0, # Particle lifetime scale=0.5, # Particle scaling ), ) self.cursor = arcade.Emitter( center_xy=(self.w / 2, self.h / 2), emit_controller=arcade.EmitMaintainCount( 30), # Alway keep 30 on screen particle_factory=lambda emitter: arcade. LifetimeParticle( # Stay bright till end filename_or_texture=self.text_red, change_xy=(random.uniform(-1, 1), random.uniform(-1, 1)), lifetime=random.random( ), # die out at random times, or else this looked weird scale=1, ), ) # Add our current, always-on emitters to the list self.emitters.extend([self.fountain, self.cursor])
def emitter_15(): """Interval, emit from center, particle lifetime random in range""" e = arcade.Emitter( center_xy=CENTER_POS, emit_controller=arcade.EmitterIntervalWithTime(DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcade.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcade.rand_in_circle((0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=random.uniform(DEFAULT_PARTICLE_LIFETIME - 1.0, DEFAULT_PARTICLE_LIFETIME), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA ) ) return emitter_15.__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 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 emitter_19(): """Interval, emit on line""" e = arcade.Emitter( pos=Vec2d.zero(), 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_line(Vec2d.zero(), Vec2d(SCREEN_WIDTH, SCREEN_HEIGHT)), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_19.__doc__, e