我正在学习Python和Pygame,而我正在做的第一件事是一个简单的Snake游戏。我试图让蛇每0.25秒移动一次。这是我的代码循环部分:
while True:
check_for_quit()
clear_screen()
draw_snake()
draw_food()
check_for_direction_change()
move_snake() #How do I make it so that this loop runs at normal speed, but move_snake() only executes once every 0.25 seconds?
pygame.display.update()
我想让所有其他函数正常运行,但move_snake()每0.25秒才会运行一次。我查了一下并找到了一些答案,但对于那些制作他们的第一个Python脚本的人来说,它们看起来都太复杂了。
是否可以实际获得我的代码应该是什么样子的示例,而不仅仅是告诉我需要使用哪个函数?谢谢!
答案 0 :(得分:3)
有几种方法,例如跟踪系统时间或使用Clock
和计算滴答。
但最简单的方法是使用事件队列并使用pygame.time.set_timer()
每x ms创建一个事件:
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: # is called every 't' milliseconds
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()
答案 1 :(得分:0)
使用Clock module of Pygame跟踪时间。具体而言,tick
类的方法Clock
将向您报告自您上次调用tick
以来的毫秒数。因此,您可以在游戏循环的每次迭代的开始(或结束)调用tick
一次,并将其返回值存储在名为dt
的变量中。然后使用dt
更新与时间相关的游戏状态变量。
time_elapsed_since_last_action = 0
clock = pygame.time.Clock()
while True: # game loop
# the following method returns the time since its last call in milliseconds
# it is good practice to store it in a variable called 'dt'
dt = clock.tick()
time_elapsed_since_last_action += dt
# dt is measured in milliseconds, therefore 250 ms = 0.25 seconds
if time_elapsed_since_last_action > 250:
snake.action() # move the snake here
time_elapsed_since_last_action = 0 # reset it to 0 so you can count again