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()
Example #2
0
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()
Example #3
0
    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)