PYGAME - 创建时钟并定期执行操作

问题描述 投票:0回答:2

我正在制作一款游戏,屏幕顶部的移动立方体将以一定的间隔向屏幕下方发射立方体。我该怎么做呢。例如,我希望每 1 秒移动立方体就会沿着屏幕向玩家图标发射一枚射弹,当它到达屏幕上方时,它将在移动立方体所在的位置重生并能够再次发射。

这就是我目前所拥有的。

import pygame

pygame.init()

screen = pygame.display.set_mode((280, 800))

pygame.display.set_caption("Cube Run")

icon = pygame.image.load("cube.png")
pygame.display.set_icon(icon)

player_icon = pygame.image.load("cursor.png")
player_x = 128
player_y = 750
player_x_change = 0

cube_1 = pygame.image.load("rectangle.png")
cube1_x = 128
cube1_y = 0

cube1_x_change = 0.8

cube_fire = pygame.image.load("rectangle.png")
cube_fire_x = 0
cube_fire_y = 0

cube_y_change = 1.5
cube_fire_state = "ready"

def player(player_x, player_y):
    screen.blit(player_icon, (player_x, player_y))

def cube(cube1_x, cube1_y):
    screen.blit(cube_1, (cube1_x, cube1_y))

def cube_enemy(cube_fire_x, cube_fire_y):
    screen.blit(cube_fire, (cube_fire_x, cube_fire_y))

running = True
while running:

    screen.fill((255, 255, 255))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                player_x_change += 0.7
            if event.key == pygame.K_LEFT:
                player_x_change -= 0.7
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT or pygame.K_LEFT:
                player_x_change = 0

    player_x += player_x_change
    if player_x < 0:
        player_x = 0
    elif player_x > 280-32:
        player_x = 280-32

    cube1_x += cube1_x_change
    if cube1_x > 248:
        cube1_x_change = -1
        cube1_x += cube1_x_change
    elif cube1_x < 0:
        cube1_x_change = 1
        cube1_x += cube1_x_change

    cube_fire_x += cube1_x

    cube_enemy(cube_fire_x, cube_fire_y)

    player(player_x, player_y)

    cube(cube1_x, cube1_y)

    pygame.display.update()
python pygame clock
2个回答
2
投票

您可以使用

pygame.time.set_timer
注册活动。创建一个新事件并设置在触发之前应经过多少毫秒。该事件将按照设定的时间间隔出现。

FIRE_EVENT  = pygame.USEREVENT + 1  # This is just a integer.
OTHER_EVENT = pygame.USEREVENT + 2  # This is how you define more events.

pygame.time.set_timer(FIRE_EVENT, 1000)  # 1000 milliseconds is 1 seconds.

然后在事件循环中,检查此事件并执行您想要的操作。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        quit()
    elif event.type == FIRE_EVENT:  # Will appear once every second.
        make_square_fire()

当您想禁用该事件时,只需将间隔设置为0即可。

pygame.time.set_timer(FIRE_EVENT, 0)

0
投票

在您的代码中,您不包含任何类型的时间管理器 - 这意味着您的代码将尽可能快地运行,您无法真正控制它的速度,这实际上取决于它所在的机器工作和 CPU 负载等。

基本上,您希望在程序中刻意等待适当的时间,以便动态适应执行速度。你可以自己实现这个(这并不难,并且有很多教程),但是要初步了解它,你可以使用

pygame.time.Clock
: 首先,使用
clock = pygame.time.Clock()
创建一个时钟。 然后,在您的主循环中,调用
eta = clock.tick(FPS)
,其中
FPS
代表您希望应用程序运行的目标帧速率(如果您真的不知道什么,您可以在程序开始时将其简单地修复为60)您想要的值),并且
eta
变量测量自上次刻度调用以来经过的时间(以毫秒为单位)。

接下来,要发生一些事情,比如说,每秒,只需保留一个计数器:

counter = 1000 # in ms
clock = pygame.time.Clock()
while True:
  # do what you want
  eta = clock.tick(FPS)
  counter -= eta
  if counter < 0:
    # trigger the event
    counter += 1000
    # don't set it directly like
    # counter = 1000
    # to keep track of margin
© www.soinside.com 2019 - 2024. All rights reserved.