Как вы задерживаете определенные события в цикле while? - PullRequest
0 голосов
/ 08 мая 2018

Недавно я работал с простой и понятной RPG в python с pygame , но у меня возникли некоторые проблемы с задержкой определенных событий. Запустив код ниже, все происходит сразу.

if event.key == pygame.K_SPACE and buttonHighlight == 0:

    FireAnimation() #displays a fire image

    #DELAY HERE

    if player[6] == 'Magic': #you deal damage to the enemy
        enemy[0] = enemy[0]-(((player[1])+((player[1])*1)-enemy[4]))
    else:
        enemy[0] = enemy[0]-(((player[1])+((player[1])*1)-enemy[3]))

    #DELAY HERE

    StarAnimation() #displays a star image

    #DELAY HERE

    if enemy[6] == 'Magic': #enemy deals damage to you
        player[0] = player[0]-(((enemy[1])+((enemy[1])*1)-player[4]))
    else:
        player[0] = player[0]-(((enemy[1])+((enemy[1])*1)-player[3]))

Остальная часть кода на самом деле не актуальна, я просто хотел указать, где я хочу отложить. При этом отображаются оба изображения, игрок и противник получают урон одновременно. Спасибо!

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я уже пробовал pygame.time.delay / wait и time.sleep, но все это задерживает всю операцию! Когда я его использую, он просто толкает все вперед, поэтому все происходит одновременно через несколько секунд

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Вы можете использовать

pygame.time.delay(n)

или

pygame.time.wait(n)

для приостановки программы на n миллисекунд. delay немного точнее, но wait освобождает процессор для использования другими программами, пока Pygame ожидает. Подробнее в Pygame Docs .

0 голосов
/ 08 мая 2018

Вы можете создать два новых события (FIRE_ANIMATION_START, STAR_ANIMATION_START), которые вы отправляете в очередь событий с задержкой (с pygame.time.set_timer(eventid, milliseconds)). Затем в цикле событий вы просто проверяете это.

FIRE_ANIMATION_START = pygame.USEREVENT + 1
STAR_ANIMATION_START = pygame.USEREVENT + 2

# ... Your code ...

for event in pygame.event.get():

    if event.key == pygame.K_SPACE and buttonHighlight == 0:
        pygame.time.set_timer(FIRE_ANIMATION_START, 10)    # Post the event every 10 ms.
        pygame.time.set_timer(STAR_ANIMATION_START, 1000)  # Post the event every 1000 ms.

    elif event.code == FIRE_ANIMATION_START:
        pygame.time.set_timer(FIRE_ANIMATION_START, 0)     # Don't post the event anymore.
        FireAnimation() #displays a fire image
        if player[6] == 'Magic': #you deal damage to the enemy
            enemy[0] = enemy[0]-(((player[1])+((player[1])*1)-enemy[4]))
        else:
            enemy[0] = enemy[0]-(((player[1])+((player[1])*1)-enemy[3]))

    elif event.code == STAR_ANIMATION_START:
        pygame.time.set_timer(STAR_ANIMATION_START, 0)     # Don't post the event anymore.
        StarAnimation() #displays a star image
        if enemy[6] == 'Magic': #enemy deals damage to you
             player[0] = player[0]-(((enemy[1])+((enemy[1])*1)-player[4]))
        else:
             player[0] = player[0]-(((enemy[1])+((enemy[1])*1)-player[3]))

Документация для pygame.time.set_timer(eventid, milliseconds). Кроме того, поскольку код прямо сейчас, в нем есть ошибки. Атрибуты для событий различаются для разных типов событий, поэтому всегда проверяйте, является ли событие KEYDOWN или USEREVENT, прежде чем обращаться к атрибутам event.key или event.code. Различные типы и атрибуты можно найти здесь .

0 голосов
/ 08 мая 2018

Если вы знаете, сколько вам нужно времени, вы можете просто добавить:

from time import sleep
...
sleep(0.1)

Это добавит задержку в 100 миллисекунд

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