【问题标题】:Trying to use pygame event function to allow player to exit game if x is pressed尝试使用 pygame 事件函数让玩家在按下 x 时退出游戏
【发布时间】:2020-04-03 16:37:48
【问题描述】:

如果你看下面的代码,我的绘图函数中有 if 条件,可以根据目标精灵组的长度呈现赢家屏幕和输家屏幕(这是一个目标射击游戏)。我添加了一个名为 game_over 的布尔变量。当显示输家或赢家屏幕时,这将更改为 True。然后,在游戏循环中,我添加了一个事件,如果按下 x,则终止 while 循环。经过测试,pressign 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

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    全局命名空间中的变量game_over 永远不会变为真。
    game_overrefresh_window 范围内的局部变量。如果要在全局命名空间中设置相同的命名变量game_over,则必须使用global statement

    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
    

    另一种选择是从refresh_window 返回game_over

    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()
    

    【讨论】:

    • @j_yerbe game_over 在函数中被使用了两次。 while 循环 (while exec:) 是否也在函数中?如果是,那么您也必须在此函数中输入global game_over
    • 我无法在 while 循环中将其声明为全局。不幸的是,在刷新窗口函数中对其进行全球化也没有任何效果。我正在使用一个名为 repl.it 的网站,我不知道你是否知道。也许它不适用于 repl.it 但我不明白为什么它不会
    • @j_yerbe 你在哪里打电话给refresh_window?你在循环中调用它吗?
    • 在游戏循环中是的
    • @j_yerbe 请参阅答案的第二部分。
    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多