我正在制作一款游戏,屏幕顶部的移动立方体将以一定的间隔向屏幕下方发射立方体。我该怎么做呢。例如,我希望每 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()
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)
在您的代码中,您不包含任何类型的时间管理器 - 这意味着您的代码将尽可能快地运行,您无法真正控制它的速度,这实际上取决于它所在的机器工作和 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