def die(self): snd.load_sound("explode.wav") self.image = gfx.img_explosion_final self.image = pg.transform.scale(self.image, (300, 300)) s = gfx.screen.blit(self.image, (self.rect.x - 50, self.rect.y - 120)) pg.display.update(s) self.kill()
def die(self): self.last_x = self.rect.x self.last_y = self.rect.y load_sound("explode.wav") gfx.explosion(self.last_x, self.last_y) self.power_level = 1 self.dead = True
def shoot(self, target): for bullet in range(self.BULLETS_MAX): new_bullet = Bullet(self.rect.centerx, self.rect.bottom, gfx.img_enemy_shot_a) new_bullet.dx = 5 * cos(helper_functions.calc_angle(self, target)) new_bullet.dy = 5 * sin(helper_functions.calc_angle(self, target)) self.allBullets.add(new_bullet) snd.load_sound("enemy_shoot.wav") self.has_shot = True
def end_message(self): pg.mixer.music.stop() snd.load_sound("music/winning.ogg") message = self.font.render("Thanks for playing!", True, WHITE) self.screen.blit(message, SCREEN_CENTER) pg.display.flip() pg.time.wait(5000)
def die(self): for i in range(9): pg.display.update( gfx.explosion(self.center[0] + randrange(-100, 100, 20), self.center[1] + randrange(-100, 100, 20))) snd.load_sound("explode.wav") self.image = pg.transform.scale2x(gfx.load_image("explosion_last.png")) snd.load_sound("blow_up.wav") pg.display.update() snd.play_song("saturns_folly.ogg") self.kill()
def fire_beam(self): beam = Bullet(self.rect.centerx, self.rect.bottom - 60, gfx.img_beam) beam.dy = 8 self.allBullets.add(beam) snd.load_sound("firing_beam.wav") s = gfx.screen.blit(gfx.img_beam_arc, (self.rect.centerx - (gfx.img_beam_arc.get_width() / 2), self.rect.bottom - 100)) pg.display.update(s) self.has_shot = True
def game_over(self): pg.mixer.music.stop() snd.load_sound("music/death.ogg") self.screen.fill((255, 255, 255)) for i in range(255): self.screen.fill((255 - i, 255 - i, 255 - i)) pg.display.update() import glob for image in sorted(glob.glob(path.join("graphics/GAMEOVER", "*.png"))): self.screen.fill(BLACK) part = pg.image.load(image).convert() self.screen.blit(part, (SCREEN_CENTER[0] - 250, SCREEN_CENTER[1])) pg.display.update() pg.time.wait(2000)
def shoot(self): if not self.dead and not self.arrive: self.shooting = True if self.power_level == 1 and (pg.time.get_ticks() > self.cool_down + 100): self.cool_down = pg.time.get_ticks() load_sound("pewpew.wav") new_bullet1 = main.Bullet(self.rect.centerx - 5, self.rect.bottom - self.size[1], gfx.img_bullet) new_bullet2 = main.Bullet(self.rect.centerx + 5, self.rect.bottom - self.size[1], gfx.img_bullet) new_bullet1.dy = -15 new_bullet2.dy = -15 self.allBullets.add(new_bullet1, new_bullet2) elif self.power_level == 2 and (pg.time.get_ticks() > self.cool_down + 20): self.t += 1 self.cool_down = pg.time.get_ticks() new_bullet1 = main.Bullet(self.rect.centerx - 10, self.rect.bottom - self.size[1], gfx.img_bullet_2) new_bullet2 = main.Bullet(self.rect.centerx + 10, self.rect.bottom - self.size[1], gfx.img_bullet_2) new_bullet3 = main.Bullet(self.rect.centerx - 25, self.rect.bottom - self.size[1], gfx.img_bullet_2) new_bullet4 = main.Bullet(self.rect.centerx + 25, self.rect.bottom - self.size[1], gfx.img_bullet_2) new_bullet1.dy = -10 new_bullet2.dy = -10 new_bullet3.dy = -10 new_bullet4.dy = -10 if self.t == 2: self.allBullets.add(new_bullet1) self.allBullets.add(new_bullet2) load_sound("pewpew2.wav") if self.t == 4: self.allBullets.add(new_bullet3) self.allBullets.add(new_bullet4) load_sound("pewpew2.wav") if self.t > 5: self.t = 0 elif self.power_level >= 3 and (pg.time.get_ticks() > self.cool_down + 50): self.t += 1 self.cool_down = pg.time.get_ticks() new_bullet = main.Bullet(self.rect.centerx - 60, self.rect.y, gfx.img_bullet_3) new_bullet.dy = -20 new_bullet.image = pg.transform.scale(new_bullet.image, (150, 100)) if self.t >= 4: self.allBullets.add(new_bullet) load_sound("pewpew3.wav") self.t = 0
def on_pickup(self): snd.load_sound("powerup.wav") self.kill()
def title_screen(self): scroll = 0 anim = 0 ship_image = None while True: title_a = gfx.img_title_a title_b = gfx.img_title_b title_size = title_a.get_size() steps = int(title_size[0] / 2) for i in range(steps + 75): self.screen.blit(gfx.img_title_background, (0, 0)) self.screen.blit(gfx.img_title_stars, (0, 100)) self.screen.blit(title_a, (10 - title_size[0] + i * 2, 300)) self.screen.blit(title_b, (10 + SCREEN_WIDTH - i * 2, 300)) pg.display.flip() snd.load_sound("blow_up.wav") for i in range(100): pg.display.update(self.screen.fill(WHITE)) self.screen.blit(gfx.img_title_background, (0, 0)) snd.play_song("title_song.ogg") break while True: if scroll <= SCREEN_WIDTH: scroll += .5 else: scroll = 0 self.screen.blit(gfx.img_title_stars, (scroll, 100)) self.screen.blit(gfx.img_title_stars, (-SCREEN_WIDTH + scroll, 100)) self.screen.blit(gfx.img_title_whole, (SCREEN_CENTER[0] - gfx.img_title_whole.get_width() / 2 + 20, 300)) for _ in range(1): if anim < 20: ship_image = gfx.title_ship_a elif anim > 20: ship_image = gfx.title_ship_b self.screen.blit(ship_image, (SCREEN_CENTER[0] - (gfx.title_ship_a.get_width() / 2) + 20, 600)) if anim < 50: menu = self.font.render("PRESS ENTER", True, WHITE) self.screen.blit(menu, (SCREEN_CENTER[0] - menu.get_width() / 2, SCREEN_CENTER[1])) elif anim > 50: menu = self.font.render("PRESS ENTER", True, BLACK) self.screen.blit(menu, (SCREEN_CENTER[0] - menu.get_width() / 2, SCREEN_CENTER[1])) anim += 1 if anim >= 100: anim = 0 pg.display.update() e = pg.event.poll() if e.type == pg.KEYDOWN: if e.key == pg.K_RETURN: snd.load_sound("takeoff.wav") while True: for i in range(255): self.screen.fill((255 - i, 255 - i, 255 - i)) helper_functions.scanlines() pg.display.update() break break while True: text = self.font.render("GET READY", True, WHITE) count_list = ["5", "4", "3", "2", "1", "GO!"] for i in range(6): countdown = self.font.render(count_list[i], True, WHITE) self.screen.fill(BLACK) self.screen.blit(text, (SCREEN_CENTER[0] - text.get_width() / 2, SCREEN_CENTER[1])) self.screen.blit(countdown, (SCREEN_CENTER[0] - countdown.get_width() / 2, SCREEN_CENTER[1] + 30)) helper_functions.scanlines() pg.display.update() pg.time.wait(1000) break snd.play_song("saturns_folly.ogg") self.started = True
def update_loop(self): # self.gametime = round(time() - self.start_time) self.ticker += 1 if self.ticker == self.FPS: self.gametime += 1 self.ticker = 0 self.all_sprites.add(self.player_bullets) self.all_sprites.add(self.enemy_bullets) self.all_sprites.add(self.player) self.all_sprites.add(self.enemies) self.all_sprites.add(self.powerups) if self.player_lives <= 0: self._is_running = False if self._is_running and self.gametime > 10: if not self.boss_defeated and not self.player.dead: if len(self.cruiser) < 1 and self.KILL_COUNT >= 99: snd.play_song("deadly_opposition.ogg") big_enemy = EnemyCruiser() self.cruiser.add(big_enemy) self.enemies.add(self.cruiser) if len(self.fighters) < self.MAX_ENEMIES: if len(self.cruiser) == 0: self.spawn_timer += 1 if self.spawn_timer >= 20: little_enemy = EnemyFighter() self.fighters.add(little_enemy) self.enemies.add(self.fighters) self.spawn_timer = 0 if len(self.frigates) < 1: frigate = EnemyFrigate() frigate.rect.y = choice([50, 100, 150, 200, 250, 300]) frigate.rect.right = 0 self.frigates.add(frigate) self.enemies.add(self.frigates) if self.ENEMIES_KILLED > 25: self.MAX_ENEMIES += 1 self.ENEMIES_KILLED = 0 for fighter in self.fighters: if not self.player.dead or self.player.arrive or self.player.respawn or self.player.invulnerable: if not fighter.has_shot: if abs(self.player.rect.y - fighter.rect.bottom <= 300) and abs( self.player.rect.centerx - fighter.rect.centerx <= 500) and fighter.rect.y <= 900: fighter.shoot(self.player) self.enemy_bullets.add(fighter.allBullets) for frigate in self.frigates: if frigate.rect.left >= SCREEN_WIDTH: frigate.kill() if frigate.rect.centerx == self.player.rect.centerx: frigate.shoot() self.enemy_bullets.add(frigate.allBullets) for cruiser in self.cruiser: print(cruiser.HEALTH) if cruiser.HEALTH < 1: print("DEAD") self.boss_defeated = True cruiser.die() if self.player.dead: cruiser.allBullets.empty() # if cruiser.rect.bottom <= self.player.rect.bottom: # new_bullet = Bullet(cruiser.rect.centerx, cruiser.rect.y, gfx.img_enemy_shot_a) # if self.player.rect.centerx < cruiser.rect.centerx: # new_bullet.dx = -10 # cruiser.allBullets.add(new_bullet) # elif self.player.rect.centerx > cruiser.rect.centerx: # new_bullet.dx = 10 # cruiser.allBullets.add(new_bullet) self.enemy_bullets.add(cruiser.allBullets) if not self.player.invulnerable: for enemy in self.enemies: if pg.sprite.collide_mask(self.player, enemy): enemy.HEALTH -= 10 self.player.die() self.player_lives -= 1 for bullet in self.enemy_bullets: if not self.player.dead and self.player.rect.colliderect(bullet.rect): self.player.die() bullet.kill() self.player_lives -= 1 for bullet in self.player_bullets: for enemy in self.enemies: if enemy.HEALTH > 0 and enemy.rect.y >= 10 and pg.sprite.collide_mask(bullet, enemy): bullet.on_hit() snd.load_sound("hit.wav") enemy.is_hit = True enemy.HEALTH -= 1 if self.player.power_level <= 2: bullet.kill() if enemy.HEALTH <= 0: self.ENEMIES_KILLED += 1 self.KILL_COUNT += 1 pwr_up = PowerUp() pwr_up.rect = enemy.rect if randint(1, 20) == self.drop_chance: self.powerups.add(pwr_up) for beam in EnemyCruiser.allBullets: for fighter in self.fighters: if pg.sprite.collide_mask(beam, fighter): fighter.die() for frigate in self.frigates: if pg.sprite.collide_mask(beam, frigate): frigate.die() for powerup in self.powerups: if pg.sprite.collide_mask(powerup, self.player): powerup.on_pickup() self.player.power_level += 1 for sprite in self.all_sprites: if 0 > sprite.rect.x > SCREEN_WIDTH: sprite.kill() self.all_sprites.remove(sprite) if 0 > sprite.rect.y > SCREEN_HEIGHT: sprite.kill() self.all_sprites.remove(sprite) # Mimic the apperance of hyper drive if self.player.arrive: self.star_speed = 10 else: self.counter += 1 if self.star_speed > 2 and self.counter >= 10: self.star_speed -= 1 self.counter = 0 else: pass # Player ship leaves after boss defeated if self.boss_defeated: self.enemy_bullets.empty() self.star_speed = 5 self.player.dx = 0 self.player.move_up() if self.player.rect.bottom <= 0: self._is_running = False self.all_sprites.update() self.clock.tick(self.FPS)
def update(self): if self.is_hit: self.image = gfx.img_cruiser_hit self.is_hit = False if self.HEALTH < 0: self.die() else: self.image = gfx.img_cruiser if not (self.charging or self.firing) and self.rect.bottom == SCREEN_HEIGHT / 2: self.dy = 0 self.charge = 0 self.duration = 0 self.next_shot += 1 if self.next_shot >= 250: self.charging = True self.next_shot = 0 if self.charging: self.has_shot = False self.firing = False self.charge += 1 snd.load_sound("charging.wav") if self.charge >= 150: self.firing = True if self.firing: self.charging = False self.image = gfx.img_cruiser_firing self.beamtime += 1 if self.beamtime >= 5: self.duration += 1 self.fire_beam() self.beamtime = 0 if self.duration >= 20: self.image = gfx.img_cruiser self.has_shot = True self.firing = False if self.has_shot and not self.firing: # Move to new position based on last location if self.new_pos == "middle_to_left": if self.rect.left > 100: self.dx = -1 else: self.dx = 0 self.new_pos = "left_to_middle" self.has_shot = False if self.HEALTH < 500 and self.rect.centerx % 10 == 0: self.fire_shots() elif self.new_pos == "left_to_middle": if self.rect.centerx < SCREEN_CENTER[0]: self.dx = 1 else: self.dx = 0 self.new_pos = "middle_to_right" self.has_shot = False if self.HEALTH < 500 and self.rect.centerx % 10 == 0: self.fire_shots() elif self.new_pos == "middle_to_right": if self.rect.right < SCREEN_WIDTH - 100: self.dx = 1 else: self.dx = 0 self.new_pos = "right_to_middle" self.has_shot = False if self.HEALTH < 500 and self.rect.centerx % 10 == 0: self.fire_shots() elif self.new_pos == "right_to_middle": if self.rect.centerx > SCREEN_CENTER[0]: self.dx = -1 else: self.dx = 0 self.new_pos = "middle_to_left" self.has_shot = False if self.HEALTH < 500 and self.rect.centerx % 10 == 0: self.fire_shots() if self.rect.left > 0 and self.rect.right < SCREEN_WIDTH: self.rect.x += self.dx self.rect.y += self.dy elif self.HEALTH < self.HEALTH / 2: self.dx *= 2
def die(self): snd.load_sound("explode.wav") self.image = gfx.img_explosion s = gfx.screen.blit(self.image, (self.rect.x - 40, self.rect.y - 40)) pg.display.update(s) self.kill()
def update(self): if self.arrive: self.appear() load_sound("leave_hyperspace.wav") elif self.respawn: self.invulnerable = True self.appear() if self.invulnerable: imgs = [gfx.img_player, gfx.img_player_invulnerable] self.image = choice(imgs) self.invulnerable_timer += 1 if self.invulnerable_timer >= 180: self.image = gfx.img_player self.invulnerable_timer = 0 self.invulnerable = False if self.rect.right > SCREEN_WIDTH: self.rect.x = SCREEN_WIDTH - self.size[0] self.dx = 0 elif self.rect.left < 0: self.rect.x = 0 self.dx = 0 elif self.rect.bottom > SCREEN_HEIGHT and not self.dead: self.rect.bottom = SCREEN_HEIGHT self.dy = 0 if self.moving: if not all([self.dead or self.respawn or self.arrive]): # for i in range(self.speed): # self.rect.x += self.dx # self.rect.y += self.dy self.rect.x += round(self.dx * self.dv) self.rect.y += round(self.dy * self.dv) if self.dv < self.speed: self.dv += 1.005 else: if not self.invulnerable: self.image = gfx.img_player self.rect.x += self.dx * self.dv self.rect.y += self.dy * self.dv if self.dv > 0: self.dv -= .5 else: self.dv = 0 if self.dead: self.rect.y = self.start_position self.dead_timer += 1 if self.dead_timer >= 180: self.rect.centerx = SCREEN_WIDTH / 2 self.dead = False self.respawn = True else: self.dead_timer = 0 if not self.shooting: self.t = 0 self.moving = False self.allBullets.update()