我应该如何为子画面表中的子画面分配名称?

时间:2019-06-01 10:01:47

标签: python python-3.x pygame sprite-sheet

我知道如何加载Sprite工作表,裁剪图像并返回这些图像的列表,但是我希望通过名称而不是索引来引用我的Sprite,以保持代码的可读性和可管理性,但是有时它很长而且写出精灵名称列表很乏味。

我通常创建一个字典,并按名称引用我需要的精灵,但是我想知道是否应该对名称进行硬编码?

这是我通常要做的:

sprites = load_spritesheet('spr_buttons.png', (64, 64))
BUTTON_NAMES = ['start', 'start_hover', 'start_click', 'back', 'back_hover',
                'back_click', 'skip', 'skip_hover', 'skip_click', 'exit',
                'exit_hover', 'exit_click', 'check', 'check_hover',
                'check_click', 'blank']
spr_buttons = {}
for index, sprite in enumerate(sprites):
    spr_buttons[BUTTON_NAMES[index]] = sprite

以这些按钮精灵为例,我还有一个按钮类,并为每个按钮创建了一个新实例,并传入了精灵的名称。

这很好,但是我想找到一种更好的方法。我是否要创建一个.txt文件来陪伴我的Sprite工作表并从中获取名称?还是我使用分配给每个子画面的关键字+索引号(例如button_1button_2等)?

3 个答案:

答案 0 :(得分:2)

您可以使用zip()函数以简单的方式创建字典:

sprites = load_spritesheet('spr_buttons.png', (64, 64))

BUTTON_NAMES = ['start', 'start_hover', 'start_click', 'back', 'back_hover',
                'back_click', 'skip', 'skip_hover', 'skip_click', 'exit',
                'exit_hover', 'exit_click', 'check', 'check_hover',
                'check_click', 'blank']

spr_buttons = dict(zip(BUTTON_NAMES, sprites))

答案 1 :(得分:1)

我建议定义enum来命名按钮:

from enum import Enum
class Button(Enum):
    start = 0
    start_hover = 1
    # [...]

创建一个字典,其中每个按钮都与枚举器相关联:

spr_buttons = dict(zip(Button, sprites))

因此可以通过以下方式访问按钮:

sprite = spr_buttons[Button.start] 

,甚至使用getattr和名称:

sprite = spr_buttons[getattr(Button, "start")]

或者,您可以创建按钮列表并通过枚举器的.value属性进行访问,该属性是列表的索引:

spr_buttons = list(sprites)
sprite = spr_buttons[Button.start_hover.value]

答案 2 :(得分:0)

您可以使用子画面的序列解压缩将它们分配给您要使用的名称:

sprites = load_spritesheet('spr_buttons.png', (64, 64))

start, start_hover, start_click, back, back_hover, back_click, \
skip, skip_hover, skip_click, exit, exit_hover, exit_click, \
check, check_hover, check_click, blank = sprites