Pygame: как отображать изображение до нажатия клавиши - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь построить игру в Pygame, в которой, если игрок переходит на красный квадрат, он проигрывает. Когда это происходит, я хочу отобразить картину взрыва, где проигрыватель проиграл, пока пользователь не нажмет любую клавишу на клавиатуре. Когда пользователь нажимает клавишу, я вызываю функцию new_game (), чтобы начать новую игру. Проблема в том, что мой код, кажется, пропускает строку, в которой я уничтожаю взрыв, и вместо этого просто запускает новую игру прямо сейчас.

Я пытался использовать что-то подобное, но я не уверен, что поместить в цикл while (я хочу подождать, пока не произойдет нажатие клавиши):

while event != KEYDOWN:
   # Not sure what to put here

Если я поместил time.sleep () в цикл while, вся программа зависнет и изображение не будет стерто.

Вот я загружаю изображение в Pygame:

explosionpic = pygame.image.load('C:/Users/rohan/Desktop/explosion.png')

И вот где я это называю / определяю, проиграл ли игрок (программа, кажется, пропускает строку screen.blit, потому что я даже не вижу изображение вообще):

if get_color(p1.x + p1_velocity_x, p1.y + p1_velocity_y) == red:  # If player lands on a red box
    screen.blit(explosionpic, (p1.x, p1.y))
    # Bunch of other code goes here, like changing the score, etc.
    new_game()

Предполагается, что изображение будет отображаться, затем, когда пользователь нажимает клавишу, вызывается функция new_game ().

Буду признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Самое простое решение, которое приходит мне в голову, - написать небольшую независимую функцию, которая задержит выполнение кода.Что-то вроде:

def wait_for_key_press():
    wait = True
    while wait:
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                wait = False
                break

Эта функция будет останавливать выполнение до тех пор, пока система событий не поймает сигнал KEYDOWN.

Таким образом, ваш код будет:

if get_color(p1.x + p1_velocity_x, p1.y + p1_velocity_y) == red:  # If player lands on a red box
    screen.blit(explosionpic, (p1.x, p1.y))
    pygame.display.update() #needed to show the effect of the blit
    # Bunch of other code goes here, like changing the score, etc.
    wait_for_key_press()
    new_game()
1 голос
/ 24 мая 2019

Добавить в игру состояние, которое указывает, запущена ли игра, произойдет ли это или нужно начать новую игру. Определите состояния RUN, EXPLODE и NEWGAME. Инициализируйте состояние game_state:

RUN = 1
EXPLODE = 2
NEWGAME = 3

game_state = RUN

В случае взрыва устанавливается состояние EXPLODE

if get_color(p1.x + p1_velocity_x, p1.y + p1_velocity_y) == red:  # If player lands on a red box
    game_state = EXPLODE

При нажатии клавиши переключиться в состояние NEWGAME:

if game_state == EXPLODE and event.type == pygame.KEYDOWN:
    game_state = NEWGAME

Когда newgame() был выполнен, тогда установите game_state = RUN:

newgame()
game_state = RUN

Реализация отдельного регистра в основном цикле для каждого состояния игры. С этим решением не требуется никакого «сна»:

* * 1 022, например,
ENDGAME = 0
RUN = 1
EXPLODE = 2
NEWGAME = 3

game_state = RUN
while game_state != ENDGAME:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_state = ENDGAME

        if game_state == EXPLODE and event.type == pygame.KEYDOWN:
            game_state = NEWGAME


    if game_state == RUN:
        # [...]

        if get_color(p1.x + p1_velocity_x, p1.y + p1_velocity_y) == red:  # If player lands on a red box
            game_state = EXPLODE

        # [...]

    elif game_state == EXPLODE:
        screen.blit(explosionpic, (p1.x, p1.y))

    elif game_state == NEWGAME:
        newgame()
        game_state = RUN

    pygame.display.flip()
...