Есть ли что-то, что может повлиять на time.sleep (), чтобы это произошло раньше, что мне нужно? - PullRequest
1 голос
/ 17 мая 2019

Я новичок и узнаю о пигмеях.Я следую руководству по простой игре, и я не могу понять, в чем проблема.У меня есть функция сбоя и использую time.sleep ().Но время сна наступает раньше, что делает весь код вроде бесполезным.

Я работаю на Mac, но не думаю, что это должно быть причиной.

Я попытался поставить time.sleep () в другую функцию и используйте эту функцию в функции сбоя, но это не работает, и я не уверен, что 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 Crashed», затем подождать 2 секунды и перезапустить игру с помощью функции game_loop ().Но он останавливает игру, ждет 2 секунды, затем пишет «You Crashed» и немедленно перезапускает игру.

1 Ответ

1 голос
/ 17 мая 2019

Это происходит потому, что после обновления поверхности экрана с помощью pygame.display.flip() или pygame.display.update() вам придется обрабатывать события (например, вызывая pygame.event.get), чтобы дать окну возможность перерисовать себя.

Это может работать в Windows, потому что управление окнами там работает иначе, но все равно будет "неправильно".

Вы должны придерживаться этих правил:

  • никогдакогда-либо звоните time.sleep (если вы не знаете лучше)
  • никогда не звоните 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'        

Аналогичная проблема:
Два обновления дисплея одновременно с функцией pygame.time.wait () между
pygame.time.wait () заставляет окно зависать
pygame - как медленно обновлять панель HP без time.sleep ()

Подробнее о состояниях игры:
Уровень Pygame / состояния меню

Вероятно, также интересно:
Потоковая проблема с Pygame

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...