如何使用 pygame 执行秒/毫秒的 for 循环?

Posted

技术标签:

【中文标题】如何使用 pygame 执行秒/毫秒的 for 循环?【英文标题】:How can i do a for loop with seconds/milliseconds using pygame? 【发布时间】:2019-04-30 23:48:55 【问题描述】:

我正在尝试制作蛇游戏,但在让蛇正确移动时遇到了一些麻烦。当我运行这段代码时,他确实穿过了屏幕。但我无法让显示器更新每个 。

我想知道是否有办法像这样设置 for 循环:

for seconds in  idk:
    pygame.display.update()
    self.x += self.speed

import pygame
import time
pygame.init()

## creates window
win = pygame.display.set_mode((1000, 1000))
## gives titale to window
pygame.display.set_caption("Snake attempt")

class Character():
    def __init__(self, height= 40, width = 40,x = 50,y= 50,speed = 20):
            self.height = height
        self.width = width
        self.x = x
        self.y = y
        self.speed = 20
    def create(self):
    ## rect(draw on, ( colors) (pos.x , pos.y . width, height))
        pygame.draw.rect(win, (255,0, 0) , (self.x, self.y, 
self.width, self.height))
        pygame.display.update()
    def movement(self):
        self.x += self.speed
        pygame.display.update()


game_on = True
game_off = False

player = Character()

while game_on:
    pygame.time.delay(100)

## gives all events that happen while Game_on = True

        for event in pygame.event.get():

        if event.type == pygame.QUIT:
            pygame.quit()

## call on sys.exit()Caracter class         
    player.create()
    player.movement()

基本上我只是希望玩家每隔多少秒在屏幕上移动这么多空间。每次都刷新显示

【问题讨论】:

您不能在while 循环中使用for 循环,因为它会停止其他元素。您必须使用当前的while 来执行此操作。您可以使用current_time = pygame.time.get_ticks() 获取当前时间并在开始时设置time_to_change_speed = pygame.time.get_ticks() + 3000 并稍后检查if current_time >= time_to_change_speed: self.x += self.speed ; time_to_change_speed = current_time + 3000 你应该在每个循环中只使用一次update() - 不要在每次 blit/draw 之后使用它,而是在所有 blits/draws 之后使用它。如果你在每次 blit 之后使用update(),那么它会显示不完整的图像。 您可以使用pygame.time.Clock() 以FPS(每秒帧数)控制游戏的速度,然后在每一帧中您可以移动20/FPS 像素,并在1 秒内获得20 个像素。跨度> 【参考方案1】:

您已经有了一个完美的、延迟 100 毫秒的事件循环。 不要创建任何额外的延迟循环。

每秒运行十次:

    player.movement()

无论您想产生什么速度或行为, 应该在该方法内发生。 您将看到行为随着时间的推移而演变,原因是 该方法被重复调用,每秒十次。

正如 furas 有用地指出的那样,没有必要 .update() 在 create 方法中,最好将其推迟到移动完成。

请注意,在屏幕上可见的 100 毫秒是 previous 位置, 在推进x之前。

【讨论】:

以上是关于如何使用 pygame 执行秒/毫秒的 for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Excel for Mac 将代码计时到毫秒吗

如何在 Java 中将毫秒转换为“X 分钟,x 秒”?

c语言哪个时间函数是精确到毫秒的?使用srand(time(NULL))的话,如果在同一秒运行程序

以毫秒为间隔检测秒数

把毫秒换算成秒

在 Pygame 中每隔几秒移动一个对象