Попытка использовать функцию события Pygame, чтобы позволить игроку выйти из игры, если нажата кнопка x - PullRequest
1 голос
/ 03 апреля 2020

Если вы посмотрите на приведенный ниже код, у меня есть условия внутри моей функции рисования для отображения экрана победителя и экрана проигравшего в зависимости от длины целевой группы спрайтов (это целевая игра-шутер). Я добавил булеву переменную с именем game_over. Когда отображается экран проигравшего или победителя, он изменяется на True. Затем внутри игры l oop я добавил событие, если нажать x, убить время l oop. После тестирования нажатие клавиши x, похоже, ничего не делает. Однако я не понимаю, почему это может произойти, поскольку я повторил использование функции события ключа, которую использовали другие ответчики stackoverflow.

def refresh_window():
  if len(target_sprites) > 0:
   window.blit(bgr, (0,0))
  if len(target_sprites) == 0:
    window.blit(winner, (0,0))
    player_sprite.kill()
    game_over = True
  if target_1.got_away == True:
    window.blit(loser, (0,0))
    for item in target_sprites:
      item.kill()
    player_sprite.kill()
    game_over = True
while exec:
  current_time = pygame.time.get_ticks() 

  for event in pygame.event.get():
    if event.type == pygame.QUIT:
            exec = False

  key_press = pygame.key.get_pressed()
  if game_over == True:
    if key_press[K_x]:
      exec = False

1 Ответ

0 голосов
/ 03 апреля 2020

Переменная game_over в глобальном пространстве имен никогда не становится истинной.
game_over является локальной переменной в области действия refresh_window. Если вы хотите установить одноименную переменную game_over в глобальном пространстве имен, вы должны использовать оператор global :

def refresh_window():

    global game_over # <--- this is missing

    if len(target_sprites) > 0:
        window.blit(bgr, (0,0))
    if len(target_sprites) == 0:
        window.blit(winner, (0,0))
        player_sprite.kill()
        game_over = True
    if target_1.got_away == True:
        window.blit(loser, (0,0))
        for item in target_sprites:
            item.kill()
        player_sprite.kill()
        game_over = True

Другой вариант - вернуть game_over из refresh_window:

def refresh_window():
    game_over = False

    # [...]

    return game_over 
game_over = False 
while exec:
    # [...]

    key_press = pygame.key.get_pressed()
    if game_over == True:
        if key_press[K_x]:
            exec = False

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