Pygame Sound / Font / Delay, кажется, не работает

Я делаю игру типа Змея, используя 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

person thumbtackthief    schedule 17.10.2012    source источник


Ответы (3)


Может быть, вы пропали pygame.display.flip() или display.update(rectangle=endRect) сразу после screen.blit() звонка?

person mjv    schedule 17.10.2012
comment
Конечно было! Он не переворачивался, пока не добрался до конца цикла while, спустя много времени после паузы. Спасибо! - person thumbtackthief; 18.10.2012

Думаю, ваша проблема в running варибале. Если это завершит ваш основной цикл while *, он завершит программу, и это будет вашей проблемой.

* основной цикл while:

while running:
    #everything that the program does goes here

В большинстве игр он есть, и любые действия, которые могут повлиять на него, разрушат цикл и, следовательно, завершат все в вашей программе. Поскольку код, который вы указали в вопросе, будет внутри этого цикла, текст и звук не будут воспроизводиться.

Я знаю, что для python было бы разумно приостановить программу, когда он найдет команду задержки, но на самом деле он фактически не приостанавливает программу. Он просто приостанавливает pygame. Программа продолжит работу, присвоит running false, и ваш цикл только что закончился. Шрифт не будет отображаться, потому что он находится в цикле, и звук не будет воспроизводиться, потому что pygame был приостановлен. Он никогда не приостанавливался, потому что это было бы событие, вызванное в цикле while, который теперь закрыт.

В качестве примечания, причина, по которой Pygame сохраняет «замороженное» окно открытым, заключается в том, что переменные для всех остальных изображений и шрифтов на экране остаются такими же, и ему не было сказано закрыться.

Конечно, весь этот ответ мог бы быть пустой тратой нашего времени, если бы переменная running не была такой, как я думаю.

Достойный вопрос :)

person Code Monkey    schedule 17.10.2012
comment
Бег - это действительно то, чего вы ожидаете, но поведение не такое, как вы описываете. Я ожидал, что он будет воспроизводить звук, отображать текст, приостанавливать и закрывать. Вместо этого он воспроизводит звук, делает паузу, отображает текст (на мгновение) и закрывается. Если задержка - это не лучший вариант, как я могу оставить текст на экране во время воспроизведения музыки, чтобы окно не закрывалось мгновенно, когда моя змея падает? - person thumbtackthief; 18.10.2012
comment
Возможно, вы захотите взглянуть на другой ответ, потому что я думаю, что он правильный. - person Code Monkey; 18.10.2012

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
person wookie    schedule 19.09.2014
comment
пожалуйста, добавьте пояснение к вашему коду, это поможет другим быстро понять его. - person Bhushan Kawadkar; 19.09.2014