Python 是否有任何事情可以影响我需要更早地进行time.sleep()?

Python 是否有任何事情可以影响我需要更早地进行time.sleep()?,python,pygame,Python,Pygame,我是初学者,正在学习pygame。我正在学习一个简单游戏的教程,我不知道问题出在哪里。我有一个崩溃函数并使用time.sleep()。但是睡眠时间越早,整个代码就变得毫无用处 我正在Mac上工作,但我不认为这应该是造成这种情况的原因 我曾尝试将time.sleep()放入另一个函数,并在crash函数中使用该函数,但效果并不理想,我不确定time.sleep是否有某种偏好 def text_objects(text, font): textSurface = font.render(te

我是初学者,正在学习pygame。我正在学习一个简单游戏的教程,我不知道问题出在哪里。我有一个崩溃函数并使用time.sleep()。但是睡眠时间越早,整个代码就变得毫无用处

我正在Mac上工作,但我不认为这应该是造成这种情况的原因

我曾尝试将time.sleep()放入另一个函数,并在crash函数中使用该函数,但效果并不理想,我不确定time.sleep是否有某种偏好

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf',115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2),(display_height/2))
    gameDisplay.blit(TextSurf, TextRect)
    pygame.display.update()
    time.sleep(2)
    game_loop()  

def crash():
    message_display('You Crashed')
前两个函数应该不是问题,但我发布它们只是为了确定。
因此,当游戏中的汽车撞车时,应该写上“You crash”,然后等待2秒钟,然后使用game_loop()函数重新启动游戏。但它会停止游戏,等待2秒钟,然后写入“You crash”并立即重新启动游戏。

这是因为,在您使用
pygame.display.flip()
pygame.display.update()
更新屏幕表面后,您必须处理事件(例如调用
pygame.event.get
)让窗口有机会重新绘制自己

这可能适用于Windows,因为Windows的窗口管理工作方式不同,但它仍然是“错误的”

你必须遵守这些规则:

  • 永远不要叫时间。睡觉(除非你知道得更清楚)
  • 永远不要在主循环之外调用
    pygame.display.update()
    pygame.display.flip()
    (除非您知道得更清楚)
  • 永远不要有超过一个游戏循环(除非你更清楚)
  • 你的游戏运行在一个循环中,所以要做任何基于“时间”的事情(比如:打印2秒,4秒等等),你必须跟踪游戏状态中的时间(可能只是一个变量)
  • 不要从游戏循环中调用游戏循环
  • 对游戏应该如何运行、中的哪些状态可以处于、如何在状态之间移动以及每个状态下发生的情况有一个基本的了解
一个简单的例子,假设我们想创建一个小型赛车游戏,这样我们可以考虑以下状态:

  • 标题屏幕
  • 真正的赛车游戏
  • 屏幕上的游戏
一个简单的实现,在主循环中只有一个变量
state
和一个大的
if/else
块:

if state == 'TITLE_SCREEN':
    ...render title screen...
    ...if the space bar was pressed set state = 'GAME'
elif state == 'GAME':
    ...render the player, obstacles, etc...
    ...if the player crashed, set state = 'GAMEOVER' and keep track of the current time, e.g. with `timer = pygame.Clock().get_ticks()`
elif state == 'GAMEOVER':
    ...render a game over message...
    ...if the space bar was pressed or `pygame.Clock().get_ticks() - timer > 2000` set state = 'GAME'        
类似问题:


关于游戏状态的更多信息:

可能也很有趣: