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 = arcadeplus.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcadeplus.EmitBurst(25), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=spark_texture, change_xy=arcadeplus.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 = arcadeplus.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcadeplus.EmitBurst(20), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=ring_texture, change_xy=arcadeplus.rand_on_circle( (0.0, 0.0), 5.0) + arcadeplus.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 __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) arcadeplus.set_background_color(arcadeplus.color.BLACK) self.emitters = [] self.frametime_plotter = FrametimePlotter() self.launch_firework(0) arcadeplus.schedule(self.launch_spinner, 4.0) stars = arcadeplus.Emitter( center_xy=(0.0, 0.0), emit_controller=arcadeplus.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=arcadeplus.rand_in_rect( (0.0, 0.0), SCREEN_WIDTH, SCREEN_HEIGHT))) self.emitters.append(stars) self.cloud = arcadeplus.Emitter( center_xy=(50, 500), change_xy=(0.15, 0), emit_controller=arcadeplus.EmitMaintainCount(60), particle_factory=lambda emitter: AnimatedAlphaParticle( filename_or_texture=random.choice(CLOUD_TEXTURES), change_xy=(_Vec2(arcadeplus.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=arcadeplus.rand_in_circle((0.0, 0.0), 50))) self.emitters.append(self.cloud)
def make_flash(prev_emitter): """Return emitter that displays the brief flash when a firework shell explodes""" return arcadeplus.Emitter(center_xy=prev_emitter.get_pos(), emit_controller=arcadeplus.EmitBurst(3), particle_factory=lambda emitter: arcadeplus. FadeParticle(filename_or_texture=FLASH_TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), 3.5), lifetime=0.15))
def make_spinner(): spinner = arcadeplus.Emitter( center_xy=(SCREEN_WIDTH / 2, SPINNER_HEIGHT - 5), emit_controller=arcadeplus.EmitterIntervalWithTime(0.025, 2.0), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=random.choice(STAR_TEXTURES), change_xy=(0, 6.0), lifetime=0.2)) spinner.change_angle = 16.28 return spinner
def make_puff(prev_emitter): """Return emitter that generates the subtle smoke cloud left after a firework shell explodes""" return arcadeplus.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcadeplus.EmitBurst(4), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=PUFF_TEXTURE, change_xy=(_Vec2(arcadeplus.rand_in_circle( (0.0, 0.0), 0.4)) + _Vec2(0.3, 0.0)).as_tuple(), lifetime=4.0))
def emitter_27(): """Maintain a steady count of particles""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitMaintainCount(3), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_on_circle((0.0, 0.0), 2.0), lifetime=random.uniform(1.0, 3.0), )) return emitter_27.__doc__, e
def emitter_33(): """Particles that fade over time""" e = arcadeplus.Emitter(center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus. FadeParticle(filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE)) return emitter_33.__doc__, e
def emitter_12(): """Infinite emitting w/ eternal particle""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitInterval(0.02), particle_factory=lambda emitter: arcadeplus.EternalParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_12.__doc__, e
def emitter_22(): """Interval, emit from center, velocity in fixed angle and speed""" e = arcadeplus.Emitter(center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( 0.2, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=(1.0, 1.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=128)) return emitter_22.__doc__, e
def emitter_11(): """Burst, emit from center, velocity along a line""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_on_line((-2, 1), (2, 1)), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_11.__doc__, e
def emitter_9(): """Burst, emit from center, velocity in fixed angle and random speed""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.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_37(): """Rotating emitter. Particles initial velocity is relative to emitter's angle.""" e = arcadeplus.Emitter(center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=(0.0, 2.0), lifetime=2.0, scale=DEFAULT_SCALE)) e.change_angle = 10.0 return emitter_37.__doc__, e
def make_emitter(): return arcadeplus.Emitter( center_xy=(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2), emit_controller=arcadeplus.EmitterIntervalWithTime(0.0004, 15.0), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle((0.0, 0.0), 5.0), lifetime=1.0, scale=0.5, alpha=128 ) )
def emitter_8(): """Burst, emit from center, velocity in rectangle""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.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 = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.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_28(): """random particle textures""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=random.choice((TEXTURE, TEXTURE2, TEXTURE3)), change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE)) return emitter_28.__doc__, e
def emitter_1(): """Burst, emit from center, particle lifetime 1.0 seconds""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=1.0, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_1.__doc__, e
def emitter_7(): """Burst, emit from center, velocity fixed speed around 360 degrees""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT // 4), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_on_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_7.__doc__, e
def emitter_26(): """Interval, emit particles every 0.4 seconds and stop after emitting 5""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithCount(0.4, 5), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=0.6, alpha=128)) return emitter_26.__doc__, e
def emitter_25(): """Interval, emit from center, velocity along a line""" e = arcadeplus.Emitter(center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus. LifetimeParticle(filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_on_line( (-2, 1), (2, 1)), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_25.__doc__, e
def emitter_24(): """Interval, emit from center, velocity from angle with spread""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_vec_spread_deg(90, 45, 2.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_24.__doc__, e
def emitter_23(): """Interval, emit from center, velocity in fixed angle and random speed""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 8, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_vec_magnitude(45, 1.0, 4.0), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_23.__doc__, e
def emitter_3(): """Burst, emit in circle""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, center_xy=arcadeplus.rand_in_circle((0.0, 0.0), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_3.__doc__, e
def emitter_20(): """Interval, emit from center, velocity fixed speed around 360 degrees""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_on_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_20.__doc__, e
def emitter_30(): """random particle alpha""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL * 5, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE, alpha=random.uniform(32, 128))) return emitter_30.__doc__, e
def emitter_14(): """Interval, emit from center, particle lifetime 1.0 seconds""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=1.0, scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_14.__doc__, e
def emitter_17(): """Interval, emit on circle""" e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitterIntervalWithTime( DEFAULT_EMIT_INTERVAL, DEFAULT_EMIT_DURATION), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, center_xy=arcadeplus.rand_on_circle((0.0, 0.0), 100), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_17.__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 = arcadeplus.Emitter( center_xy=prev_emitter.get_pos(), emit_controller=arcadeplus.EmitBurst(random.randint(30, 40)), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=spark_texture, change_xy=arcadeplus.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_5(): """Burst, emit in rectangle""" width, height = 200, 100 centering_offset = (-width / 2, -height / 2) e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcadeplus.LifetimeParticle( filename_or_texture=TEXTURE, change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_SLOW), lifetime=DEFAULT_PARTICLE_LIFETIME, center_xy=arcadeplus.rand_in_rect(centering_offset, width, height), scale=DEFAULT_SCALE, alpha=DEFAULT_ALPHA)) return emitter_5.__doc__, e
def emitter_34(): """Dynamically generated textures, burst emitting, fading particles""" textures = [ arcadeplus.make_soft_circle_texture(48, p) for p in (arcadeplus.color.GREEN, arcadeplus.color.BLUE_GREEN) ] e = arcadeplus.Emitter( center_xy=CENTER_POS, emit_controller=arcadeplus.EmitBurst(BURST_PARTICLE_COUNT), particle_factory=lambda emitter: arcadeplus.FadeParticle( filename_or_texture=random.choice(textures), change_xy=arcadeplus.rand_in_circle( (0.0, 0.0), PARTICLE_SPEED_FAST), lifetime=DEFAULT_PARTICLE_LIFETIME, scale=DEFAULT_SCALE)) return emitter_34.__doc__, e