示例#1
0
class Firework:
    def __init__(self, screen, width, height, gravity):
        self.screen = screen
        self.width = width
        self.height = height
        self.gravity = gravity

        self.firework = Particle(screen, True,
                                 Vector3(randint(0, width), height, 0),
                                 Vector3(0, randint(-16, -10), 0))
        self.exploded = False
        self.particles = []

    def is_done(self):
        if self.exploded and len(self.particles) == 0:
            return True
        return False

    def explode(self):
        explode_force = randint(10, 30)
        for i in range(300):
            r = (random() * 360) * math.pi / 180
            f = random() * explode_force + 1
            self.particles.append(
                Particle(self.screen, False, Vector3(self.firework.pos),
                         Vector3(math.sin(r) * f,
                                 math.cos(r) * f, 0)))

    def update(self):
        if not self.exploded:
            self.firework.add_force(self.gravity)
            self.firework.update()
            self.exploded = self.firework.is_dead()
            if self.exploded:
                self.explode()

        for i in range(len(self.particles) - 1, -1, -1):
            self.particles[i].add_force(self.gravity)
            if self.particles[i].update_transparency(7):
                self.particles.pop(i)
            else:
                self.particles[i].update()

    def draw(self):
        if not self.exploded:
            self.firework.draw(white)
        for p in self.particles:
            p.draw(white)
示例#2
0
    def update(self, dt):
        self.time_passed += dt

        keys = pg.key.get_pressed()

        if not self.game.started:
            if keys[pg.K_w]:
                self.dust_timer += dt
                if self.dust_timer >= 0.3:
                    # create two particles (left and right)
                    Particle(self.game,
                             self.rect.bottomright,
                             images=[self.game.cloud_image],
                             colors=[pg.Color('white')],
                             vel=vec(1, 0),
                             random_angle=20,
                             vanish_speed=20,
                             end_size=1.4)
                    Particle(self.game,
                             self.rect.bottomleft,
                             images=[self.game.cloud_image],
                             colors=[pg.Color('white')],
                             vel=vec(-1, 0),
                             random_angle=20,
                             vanish_speed=20,
                             end_size=1.4)
                    self.dust_timer = 0

        else:
            if self.moving == 1:
                turn_force = 20  # how much the angle changes when turning
            else:
                turn_force = 50
            steer_anim_speed = 10  # turning animation speed

            current_speed = self.vel.length()

            # steer
            # cap the image index at 4 (len of animation minus 2)
            index = min(4, int(self.steer_time * steer_anim_speed))

            if keys[pg.K_a]:
                # turning left
                if self.lastdir == 'RIGHT':
                    self.steer_time = 0
                # increase the steering time
                self.steer_time += dt
                self.angle -= turn_force * dt * current_speed * self.moving
                # add 1 to the index to get the first turning sprite and set the image
                if self.moving == 1:
                    self.image = self.game.player_images[LEFT[index + 1]]
                else:
                    self.image = self.game.player_images[RIGHT[index + 1]]
                self.lastdir = 'LEFT'
            elif keys[pg.K_d]:
                # turning right
                if self.lastdir == 'LEFT':
                    self.steer_time = 0
                self.steer_time += dt
                self.angle += turn_force * dt * current_speed * self.moving
                if self.moving == 1:
                    self.image = self.game.player_images[RIGHT[index + 1]]
                else:
                    self.image = self.game.player_images[LEFT[index + 1]]
                self.lastdir = 'RIGHT'
            else:
                if self.lastdir == 'LEFT' and self.moving == 1:
                    self.image = self.game.player_images[LEFT[index]]
                elif self.lastdir == 'LEFT' and self.moving == -1:
                    self.image = self.game.player_images[RIGHT[index]]
                elif self.lastdir == 'RIGHT' and self.moving == 1:
                    self.image = self.game.player_images[RIGHT[index]]
                elif self.lastdir == 'RIGHT' and self.moving == -1:
                    self.image = self.game.player_images[LEFT[index]]

                self.steer_time -= dt

            # limit the steer time between 0 and the maximum image index
            self.steer_time = max(min(self.steer_time, steer_anim_speed * dt),
                                  0)

            # move forward or backwards
            if keys[pg.K_w]:
                self.moving = 1
                self.acc.x = self.speed
                self.acc.y = self.speed
            elif keys[pg.K_s]:
                self.moving = -1
                self.acc.x = self.speed * -0.4
                self.acc.y = self.speed * -0.4

            self.vel.x += self.acc.x * cos(self.angle) * dt
            self.vel.y += self.acc.y * sin(self.angle) * dt
            self.pos += self.vel * dt

            self.acc *= 0
            self.vel *= 0.9

            # move image up and down
            if int(self.time_passed * 5) % 2 == 0 and current_speed >= 0.01:
                self.rect.top = 85
            else:
                self.rect.top = 84

            # create dust clouds
            self.dust_timer += dt
            if self.dust_timer >= 0.2:
                if self.lastdir == 'RIGHT':
                    v = vec(3, 0) * self.moving
                elif self.lastdir == 'LEFT':
                    v = vec(-3, 0) * self.moving
                if self.steer_time >= 0.3 and current_speed > 0.04:
                    if self.moving == 1:
                        p = Particle(self.game,
                                     self.rect.midbottom,
                                     images=[self.game.cloud_image],
                                     colors=[pg.Color('white')],
                                     vel=v,
                                     random_angle=30,
                                     vanish_speed=20,
                                     end_size=1.4)
                        p.add_force(vec(0, 1), 10)
                    else:
                        p = Particle(self.game,
                                     self.rect.midbottom,
                                     images=[self.game.cloud_image],
                                     colors=[pg.Color('white')],
                                     vel=v,
                                     random_angle=30,
                                     vanish_speed=20,
                                     end_size=0.9)
                        p.add_force(vec(0, -2), 10)

                self.dust_timer = 0