使用 Python 和 Pygame 在指定时间内移动精灵

163 阅读2分钟

在开发一款类似气球爆破的游戏时,在玩家发射 25 枚导弹之后,需要将气球行使用 dy 属性向下移动。游戏中的所有功能都已正常工作,但气球行的移动时间却无法控制。目前只能让气球行无限期地移动,无法在指定时间内停止移动。

为了解决这个问题,需要找到一种方法让 Python 将 SPEED 变量设置为 2,并在指定的时间内保持这个值。目前尝试使用了一个巨大的增量计数器,但这样做只是让游戏卡顿了几秒钟,并没有移动气球。

2、解决方案

要解决这个问题,可以使用 pygame.time.Clock 对象来控制游戏中的时间。Clock 对象可以用来跟踪游戏运行的时间,并限制游戏每秒执行的帧数。这样就可以控制气球行移动的速度,并确保其在指定的时间内移动。

以下是在游戏中使用 Clock 对象来控制气球行移动的代码示例:

import pygame

# 初始化 Pygame
pygame.init()

# 设置游戏窗口的大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# 创建气球精灵
balloons = pygame.sprite.Group()
for i in range(10):
    balloon = pygame.sprite.Sprite()
    balloon.image = pygame.Surface((50, 50))
    balloon.image.fill((0, 255, 0))
    balloon.rect = balloon.image.get_rect()
    balloon.rect.x = 100 + i * 100
    balloon.rect.y = 100
    balloons.add(balloon)

# 创建导弹精灵
missiles = pygame.sprite.Group()

# 创建发射器精灵
launcher = pygame.sprite.Sprite()
launcher.image = pygame.Surface((50, 50))
launcher.image.fill((255, 0, 0))
launcher.rect = launcher.image.get_rect()
launcher.rect.x = 100
launcher.rect.y = 500

# 创建时钟对象
clock = pygame.time.Clock()

# 设置游戏的运行时间
game_time = 0

# 设置气球行移动的速度
SPEED = 0

# 主游戏循环
while True:

    # 处理游戏事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                # 创建新的导弹精灵
                new_missile = pygame.sprite.Sprite()
                new_missile.image = pygame.Surface((10, 10))
                new_missile.image.fill((255, 255, 0))
                new_missile.rect = new_missile.image.get_rect()
                new_missile.rect.x = launcher.rect.x + 25
                new_missile.rect.y = launcher.rect.y - 10
                missiles.add(new_missile)

                # 增加点击次数
                CLICKS += 1

    # 更新游戏时间
    game_time += clock.get_time()

    # 如果点击次数达到 25 次,则开始移动气球行
    if CLICKS == 25:
        SPEED = 2

    # 更新气球精灵的位置
    for balloon in balloons:
        balloon.rect.y += SPEED

    # 更新导弹精灵的位置
    for missile in missiles:
        missile.rect.y -= 10

    # 检查气球和导弹之间的碰撞
    for balloon in balloons:
        for missile in missiles:
            if balloon.rect.colliderect(missile.rect):
                # 气球被击中,将其从精灵组中移除
                balloons.remove(balloon)
                # 导弹击中气球,将其从精灵组中移除
                missiles.remove(missile)

    # 检查气球行是否已经移动到屏幕底部
    if balloons[0].rect.y > SCREEN_HEIGHT:
        # 气球行已经移动到屏幕底部,将其重新移动到屏幕顶部
        for balloon in balloons:
            balloon.rect.y = 100

    # 检查游戏是否已经运行了 1 秒
    if game_time > 1000:
        # 游戏已经运行了 1 秒,停止移动气球行
        SPEED = 0
        # 重置游戏时间
        game_time = 0

    # 绘制游戏画面
    screen.fill((0, 0, 0))
    balloons.draw(screen)
    missiles.draw(screen)
    launcher.draw(screen)
    pygame.display.update()

    # 限制游戏每秒执行的帧数
    clock.tick(60)