class LD26Main: def __init__(self, width=800,height=600): pygame.init() self.width = width self.height = height self.screen = pygame.display.set_mode((self.width, self.height)) self.state = "menu" pygame.display.set_caption("Shoot Guys") def load_sprites(self): self.player_group = CameraSpriteGroup() self.player_bullet_group = CameraSpriteGroup() self.player_max_hp = 20 self.player_healthbar = HealthBar(self.player_max_hp, self.player_max_hp, "res/player_healthbar.png", (128, 16)) self.player_healthbar.rect.x = -55 self.player_healthbar.rect.y = 10 self.player_hb_group = CameraSpriteGroup() self.player_hb_group.add(self.player_healthbar) self.enemy_group = CameraSpriteGroup() self.enemy_bullet_group = CameraSpriteGroup() self.health_bar_sprites = CameraSpriteGroup() self.max_badguys = 0 self.guys_killed = 0 self.levels = [{"img":"res/levels/level1.png", "badguys":2, "goal":6}, {"img":"res/levels/level2.png", "badguys":5, "goal":10}] self.cur_level = 0 self.load_level(0) self.menu = Menu() self.win = Win() self.die = Die() def load_level(self, levelnum): if levelnum >= len(self.levels): self.state = "win" else: leveldict = self.levels[levelnum] self.player = Player((self.width, self.height)) self.player_group.add(self.player) self.level = Level((self.width, self.height), leveldict["img"]) self.bdrop1 = Backdrop(self.level.dims, 1) self.bdrop2 = Backdrop(self.level.dims, 2) self.max_badguys = leveldict["badguys"] self.guys_killed = 0 self.kill_goal = leveldict["goal"] self.player_healthbar.set_hp(self.player_max_hp) def go(self): self.load_sprites() self.clock = pygame.time.Clock() while 1: self.clock.tick(60) self.screen.fill((0, 0, 0)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: if event.key == K_ESCAPE: if self.state == "game": self.state = "menu" else: sys.exit() elif event.key == K_RETURN: if self.state == "menu": self.state = "game" elif self.state == "win" or self.state == "die": self.load_level(0) self.state = "game" if self.state == "menu": self.do_menu() elif self.state == "game": self.do_main_game() elif self.state == "win": self.do_win() else: self.do_die() pygame.display.flip() def do_die(self): self.die.update() self.die.draw(self.screen) def do_win(self): self.win.update() self.win.draw(self.screen) def do_menu(self): self.menu.update() self.menu.draw(self.screen) def do_main_game(self): if self.guys_killed > self.kill_goal: self.cur_level += 1 self.player.kill() self.load_level(self.cur_level) offset = (self.width / 2) - self.player.rect.x, (self.height / 1.5) - self.player.rect.y while len(self.enemy_group) < self.max_badguys: xpos = random.randint(0, self.width-64) - offset[0] ypos = random.randint(0, self.height-64) - offset[1] h = HealthBar(4, 4, "res/healthbar.png", (32, 4)) b = BadGuy((self.width, self.height), 4, h, (xpos, ypos)) self.health_bar_sprites.add(h) self.enemy_group.add(b) keys = pygame.key.get_pressed() if keys[pygame.K_d]: self.player.move(pygame.K_d) elif keys[pygame.K_a]: self.player.move(pygame.K_a) if keys[pygame.K_SPACE] or keys[pygame.K_UP]: self.player.move(pygame.K_SPACE) if keys[pygame.K_RIGHT]: if self.player.can_shoot(): bullet = Bullet("right", self.level.size, self.player.rect) self.player_bullet_group.add(bullet) self.player.shoot(pygame.K_RIGHT) elif keys[pygame.K_LEFT]: if self.player.can_shoot(): bullet = Bullet("left", self.level.size, self.player.rect) self.player_bullet_group.add(bullet) self.player.shoot(pygame.K_LEFT) for guy in self.enemy_group: if guy.is_shooting(): bullet = Bullet(guy.shoot_dir, self.level.size, guy.rect) self.enemy_bullet_group.add(bullet) # remove bullets that hit terrain pygame.sprite.groupcollide(self.enemy_bullet_group, self.level, True, False) pygame.sprite.groupcollide(self.player_bullet_group, self.level, True, False) damaged_guys = pygame.sprite.groupcollide(self.enemy_group, self.player_bullet_group, False, True) for d in damaged_guys: d.damage(1) if d.hp == 0: self.guys_killed += 1 d.kill() if pygame.sprite.groupcollide(self.player_group, self.enemy_bullet_group, False, True): self.player_healthbar.set_hp(self.player_healthbar.cur_hp-1) if self.player_healthbar.cur_hp <= 0: self.state = "die" self.player.kill() guys = self.enemy_group.sprites() + self.player_group.sprites() for guy in guys: if guy.rect.top > self.level.bottom(): guy.kill() if isinstance(guy, Player): self.state = "die" else: guy.collide_with(self.level.collisions_for(guy)) self.bdrop2.update() self.bdrop2.draw(self.screen, (offset[0]/4, offset[1]/4)) self.bdrop1.update() self.bdrop1.draw(self.screen, (offset[0]/2, offset[1]/2)) self.player_bullet_group.update() self.player_bullet_group.draw(self.screen, offset) self.enemy_bullet_group.update() self.enemy_bullet_group.draw(self.screen, offset) self.enemy_group.update(self.player.rect) self.enemy_group.draw(self.screen, offset) self.player_group.update() self.player_group.draw(self.screen, offset) self.health_bar_sprites.update() self.health_bar_sprites.draw(self.screen, offset) self.level.update() self.level.draw(self.screen, offset) self.player_hb_group.update() self.player_hb_group.draw(self.screen)