Я делаю игру типа Змея, используя Pygame. Все в значительной степени работает, но вот конец моей игры. Есть звуковой эффект, и я поставил задержку, чтобы окно не закрывалось до окончания воспроизведения звука. Все работало нормально, и я просто добавил текст Game Over. По какой-то причине воспроизводится звук, игра приостанавливается, и затем на экране быстро мигает надпись Game Over. Может ли кто-нибудь объяснить мне, почему это выходит из строя?
Я использую Python 2.7 на Mac 10.6.8.
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
Ответ 2 · Code Monkey
Думаю, ваша проблема в running варибале. Если это завершит ваш основной цикл while *, он завершит программу, и это будет вашей проблемой.
* основной цикл while:
while running:
#everything that the program does goes here
В большинстве игр он есть, и любые действия, которые могут повлиять на него, разрушат цикл и, следовательно, завершат все в вашей программе. Поскольку код, который вы указали в вопросе, будет внутри этого цикла, текст и звук не будут воспроизводиться.
Я знаю, что для python было бы разумно приостановить программу, когда он найдет команду задержки, но на самом деле он фактически не приостанавливает программу. Он просто приостанавливает pygame. Программа продолжит работу, присвоит running false, и ваш цикл только что закончился. Шрифт не будет отображаться, потому что он находится в цикле, и звук не будет воспроизводиться, потому что pygame был приостановлен. Он никогда не приостанавливался, потому что это было бы событие, вызванное в цикле while, который теперь закрыт.
В качестве примечания, причина, по которой Pygame сохраняет "замороженное" окно открытым, заключается в том, что переменные для всех остальных изображений и шрифтов на экране остаются такими же, и ему не было сказано закрыться.
Конечно, весь этот ответ мог бы быть пустой тратой нашего времени, если бы переменная running не была такой, как я думаю.
Достойный вопрос :)
Ответ 3 · wookie
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