有几种方法可以实现,比如跟踪系统时间或使用一个
Clock
并计算滴答数。
但最简单的方法是使用事件队列,并在每个x毫秒创建一个事件,使用
pygame.time.set_timer()
函数:
pygame.time.set_timer()
重复在事件队列上创建一个事件
set_timer(eventid, milliseconds) -> None
设置一个事件类型,使其每隔一定的毫秒数出现在事件队列中。直到经过了指定的时间量,第一个事件才会出现。
每个事件类型都可以附加一个单独的计时器。最好使用介于pygame.USEREVENT和pygame.NUMEVENTS之间的值。
要禁用事件的计时器,请将milliseconds参数设置为0。
下面是一个小的运行示例,蛇每250毫秒移动一次:
import pygame
pygame.init()
screen = pygame.display.set_mode((300, 300))
player, dir, size = pygame.Rect(100,100,20,20), (0, 0), 20
MOVEEVENT, t, trail = pygame.USEREVENT+1, 250, []
pygame.time.set_timer(MOVEEVENT, t)
while True:
keys = pygame.key.get_pressed()
if keys[pygame.K_w]: dir = 0, -1
if keys[pygame.K_a]: dir = -1, 0
if keys[pygame.K_s]: dir = 0, 1
if keys[pygame.K_d]: dir = 1, 0
if pygame.event.get(pygame.QUIT): break
for e in pygame.event.get():
if e.type == MOVEEVENT:
trail.append(player.inflate((-10, -10)))
trail = trail[-5:]
player.move_ip(*[v*size for v in dir])
screen.fill((0,120,0))
for t in trail:
pygame.draw.rect(screen, (255,0,0), t)
pygame.draw.rect(screen, (255,0,0), player)
pygame.display.flip()
![enter image description here](https://istack.dev59.com/MObdV.webp)
自从pygame 2.0.1版本以来,使用
pygame.time.set_timer
非常容易安排事务,因为现在可以触发自定义事件一次。
下面是一个简单的示例,展示了如何在未来X秒内运行一个函数:
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
ACTION = pygame.event.custom_type()
clock = pygame.time.Clock()
def main():
shield = 0
def activate_shield():
nonlocal shield
shield += 1
return shield
def remove_shield(id):
def action():
nonlocal shield
if shield == id:
shield = 0
return action
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT: return
if e.type == pygame.KEYDOWN:
id = activate_shield()
pygame.time.set_timer(pygame.event.Event(ACTION, action=remove_shield(id)), 2000, 1)
if e.type == ACTION:
e.action()
screen.fill('black')
if shield:
pygame.draw.circle(screen, 'red', (320, 220), 35, 4)
pygame.draw.rect(screen, 'green', (300, 200, 40, 40))
pygame.display.flip()
clock.tick(60)
main()
最简单的例子:
repl.it@queueseven/Simple-Scheduler