【问题标题】:Pygame - customisable controlsPygame - 可定制的控件
【发布时间】:2014-03-08 21:14:38
【问题描述】:

我用 pygame 制作游戏已经有一段时间了,最​​后决定要为我的游戏制作可自定义的控件,以便玩家可以更改他们使用的按钮。

我之前(在 Java 中)使用配置文件完成了此操作,但是将字符串转换为按键是一个缓慢而笨重的过程。我想知道是否有人有更好的想法?

谢谢

丹尼尔

【问题讨论】:

    标签: python pygame game-development


    【解决方案1】:

    我会使用两个字典。一个将键映射到动作,例如{"up": "move_up"},另一个将动作映射到函数,例如{"move_up": player.move_up}(其中 player.move_up 是一个函数)。动作字典的键可以从配置文件中加载,动作动作可以硬编码。

    import pygame
    from ConfigParser import SafeConfigParser
    
    action2function = {
        "up": player.move_up,
        "down": player.move_down,
        "left": player.move_left,
        "right": player.move_right
    }
    
    config = SafeConfigParser()
    config.read(CONFIG_DIRS)
    key2action = config.items()
    
    ...
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            action2function[key2action[pygame.key.name(event.key)]]()
    ...
    

    【讨论】:

      【解决方案2】:

      您可以使用 dict 并将每个键分配给一个操作,当用户更改控件时,只需重新分配操作

      示例:

      key_presses = {'a' : 'example()',
                     'up' : 'rect.x +=1',
                     'down' : 'rect.y -= 1'
                     #etc
      

      那么您只需为每个按钮按下事件获得event.key,如下所示:

      #in your mainloop
      if event.type == KEYDOWN:
          key = pygame.key.name(event.key) #returns name of key in string
          exec(keypresses[event.key])
      

      event.key 返回一个 int,然后pygame.key.name() 将键的名称作为字符串返回,因此如果您按下向上按钮,它会执行从字典中获取的向上代码

      这是一种方法,不确定是否最简单,如果您有任何问题,请告诉我

      【讨论】:

      • 似乎使用 exec 可能不是最好的方法。使用由 def 或 lambdas 定义的实际函数可能更好。除非真的需要,否则使用 exec 似乎是不明智的,而这里并非如此。
      • @Nuclearman 说得对,但基本思路还可以,OP 或许能找到更好的方法
      猜你喜欢
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多