Python 在pygame中每x(毫秒)秒做一次

Python 在pygame中每x(毫秒)秒做一次,python,function,pygame,milliseconds,seconds,Python,Function,Pygame,Milliseconds,Seconds,我正在学习Python和Pygame,我做的第一件事是一个简单的蛇游戏。我试着让蛇每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

我正在学习Python和Pygame,我做的第一件事是一个简单的蛇游戏。我试着让蛇每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脚本的人来说,这些答案似乎都太复杂了

有没有可能得到一个示例来说明我的代码应该是什么样子,而不是仅仅告诉我需要使用哪个函数?谢谢

使用来记录时间。具体来说,
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

有几种方法,如跟踪系统时间或使用
时钟和计数滴答声

但最简单的方法是使用事件队列,每x ms创建一个事件,使用:

pygame.time.set\u timer()

在事件队列上重复创建事件

设置计时器(事件ID,毫秒)->无

将事件类型设置为每隔给定的毫秒数出现在事件队列上。第一个事件在经过一定时间后才会出现

每个事件类型都可以附加一个单独的计时器。最好使用pygame.USEREVENT和pygame.NumeEvents之间的值

要禁用事件的计时器,请将毫秒参数设置为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()

不要使用睡眠,它将停止整个游戏,而不仅仅是snakeGood示例程序!有没有办法让程序每隔1250毫秒从命令列表中读取一个新命令?北移。。。东移。。。向南移动?@user1839239当然。您可以创建一些常量,如
MOVE\u EAST=(1,0)
等,然后创建命令列表,如
command\u list=[MOVE\u EAST,MOVE\u NORTH,…]
并在事件处理程序中执行类似
dir=command\u list.pop(0)
的操作,以在
播放器之前获取下一个命令。MOVE\u ip…
行。听起来不错!你能写一个小例子来说明你的想法吗?我是个笨蛋!