Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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))
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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))
Ejemplo n.º 6
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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
        )
    )
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
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
Ejemplo n.º 16
0
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
Ejemplo n.º 17
0
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
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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
Ejemplo n.º 20
0
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
Ejemplo n.º 21
0
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
Ejemplo n.º 22
0
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
Ejemplo n.º 23
0
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
Ejemplo n.º 24
0
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
Ejemplo n.º 25
0
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
Ejemplo n.º 26
0
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
Ejemplo n.º 27
0
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
Ejemplo n.º 28
0
    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)
Ejemplo n.º 29
0
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
Ejemplo n.º 30
0
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