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)
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