3

我正在使用 Pygame 制作 Snake 类型的游戏。一切都很好,但下面是我的游戏的结尾。有声音效果,我设置了延迟,所以在声音播放完之前窗口不会关闭。一切都很好,我刚刚添加了 Game Over 文本。出于某种原因,声音响起,游戏暂停,然后游戏结束在屏幕上快速闪烁。谁能向我解释为什么这会出现问题?

我在 Mac 10.6.8 上使用 Python 2.7。

if w.crashed or w.x<=0 or w.x >= width - 1 or w.y<=0 or w.y >= height -1:
    gameover.play()
    font = pygame.font.Font(None, 80)
    end_game = font.render("Game Over!", True, (255, 0, 0), (0,0,0))
    endRect = end_game.get_rect(centerx = width/2, centery = height / 2)
    screen.blit(end_game, endRect)
    pygame.time.delay(3500)
    running = False
4

3 回答 3

2

会不会是你失踪了pygame.display.flip(),或者电话display.update(rectangle=endRect)刚打完screen.blit()

于 2012-10-17T22:16:45.400 回答
0

我认为您的问题出在running变量上。如果这结束了您的主 while 循环*,它将结束程序,这将是您的问题。

*主while循环:

while running:
    #everything that the program does goes here

大多数游戏都有一个,并且做任何影响它的事情都会破坏循环,因此结束程序中的所有内容。由于您在问题中显示的代码将在该循环内,因此不会播放文本和声音。

我知道python在找到延迟命令时暂停程序是有意义的,但它实际上并没有真正暂停程序。它只是暂停pygame。该程序将继续运行,分配runningfalse,并且您的循环刚刚结束。字体不会渲染,因为它在循环中,并且声音不会播放,因为 pygame 已暂停。它永远不会取消暂停,因为这将是一个在 while 循环中调用的事件,现在该循环已关闭。

作为旁注,Pygame 保持“冻结”窗口打开的原因是因为屏幕上每个其他图像和字体的变量保持不变,并且没有被告知关闭。

当然,如果running变量不是我认为的那样,那么整个答案可能会浪费我们俩的时间。

一个有价值的问题:)

于 2012-10-17T22:08:15.483 回答
0
pygame.display.flip() should be done before `pygame.time.delay(3500)`. 

将您的代码更改为此

if w.crashed or w.x<=0 or w.x >= width - 1 or w.y<=0 or w.y >= height -1:
    gameover.play()
    font = pygame.font.Font(None, 80)
    end_game = font.render("Game Over!", True, (255, 0, 0), (0,0,0))
    endRect = end_game.get_rect(centerx = width/2, centery = height / 2)
    screen.blit(end_game, endRect)

    pygame.display.update()

    pygame.time.delay(3500)

    running = False
于 2014-09-19T03:23:28.293 回答