def check_play_button(ai_settings: Settings, stats: GameStats, screen: pygame.Surface, play_button: Button, sb: ScoreBoard, ship: Ship, aliens: pygame.sprite.Group, bullets: pygame.sprite.Group, mouse_x: int, mouse_y: int) -> NoReturn: """在晚间单机play按钮时开始新游戏""" button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y) if button_clicked and not stats.game_active: # 重置游戏设置 ai_settings.initialize_dynamic_settings() # 隐藏光标 pygame.mouse.set_visible(False) # 重置游戏统计信息 stats.reset_stats() stats.game_active = True # 重置记分牌图像 sb.prep_score() sb.prep_high_score() sb.prep_level() sb.prep_ships() # 清空外星人列表和子弹列表 aliens.empty() bullets.empty() # 创建一群新的外星人,并让飞船居中 create_fleet(ai_settings, screen, ship, aliens) ship.center_ship()
def display_game(sprites: pygame.sprite.Group, live_blocks: Shape, solid_blocks: list): sprites.empty() for i in live_blocks: sprites.add(i) for i in solid_blocks: sprites.add(i) sprites.update() screen.blit(background, (0, 0)) sprites.draw(screen) pygame.display.flip()
def update_keys(self, projectiles_group: pygame.sprite.Group, enemy_projectiles_group: pygame.sprite.Group): keys = pygame.key.get_pressed() # math.ceil to avoid integer truncation if keys[settings.keys["UP"]]: #print(self.rect.y) self.y -= (self.speed * settings.DELTA_T) #print(self.rect.y) self.dirty = 1 if keys[settings.keys["DOWN"]]: self.y += (self.speed * settings.DELTA_T) self.dirty = 1 if keys[settings.keys["LEFT"]]: self.x -= (self.speed * settings.DELTA_T) self.dirty = 1 if keys[settings.keys["RIGHT"]]: self.x += (self.speed * settings.DELTA_T) self.dirty = 1 if keys[settings.keys["BOMB"]]: if self.bomb_timer <= 0: enemy_projectiles_group.empty() self.bomb_timer = 10000 self.x = max(self.x, settings.LEFT_BOUND) self.x = min(self.x + self.rect.w, settings.RIGHT_BOUND) - self.rect.w self.y = max(self.y, settings.LOWER_BOUND) self.y = min(self.y + self.rect.h, settings.UPPER_BOUND) - self.rect.h self.rect.topleft = round(self.x), round(self.y) self.hitbox.topleft = utils.x_offset(self.rect, self.hitbox.w), utils.y_offset( self.rect, self.hitbox.h) if keys[settings.keys["SHOOT"]]: if self.timer > self.fire_delay: settings.sounds["effects"]["shoot"].play() self.fire(projectiles_group) self.timer = 0 self.dirty = 1
def check_bullet_alien_collisions(ai_settings: Settings, stats: GameStats, sb: ScoreBoard, aliens: pygame.sprite.Group, bullets: pygame.sprite.Group, screen: pygame.Surface, ship: Ship) -> NoReturn: """响应子弹和外星人的碰撞""" # 删除相应的子弹和外星人 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True) if collisions: for alien in collisions.values(): stats.score += ai_settings.alien_points * len(alien) sb.prep_score() check_high_scord(stats, sb) if len(aliens) == 0: # 删除现有的子弹并创建一群外星人 bullets.empty() ai_settings.increase_speed() # 提高等级 stats.level += 1 sb.prep_level() create_fleet(ai_settings, screen, ship, aliens)
def ship_hit(ai_settings: Settings, stats: GameStats, screen: pygame.Surface, sb: ScoreBoard, ship: Ship, aliens: pygame.sprite.Group, bullets: pygame.sprite.Group) -> NoReturn: """响应被外星人撞到的飞船""" if stats.ships_left > 0: # 将ships_left减1 stats.ships_left -= 1 # 更新记分牌 sb.prep_ships() # 清空外星人列表和子弹列表 aliens.empty() bullets.empty() # 创建一群新的外星人, 并将飞创放到屏幕低端中央 create_fleet(ai_settings, screen, ship, aliens) ship.center_ship() # 暂停 sleep(0.5) else: stats.game_active = False pygame.mouse.set_visible(True)