Я знаю, как загрузить лист спрайта, обрезать изображения и вернуть список этих изображений, но мне нравится ссылаться на мои спрайты по имени, а не по индексу, чтобы сохранить код читабельным и управляемым, но иногда он длинный и утомительное написание списков имен спрайтов.
Я обычно создаю словарь и ссылаюсь на нужный мне спрайт по имени, но мне было интересно, стоит ли мне жестко кодировать имена?
Это то, что я обычно делаю:
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, сопровождающий мои листы спрайтов, и получаю из них названия? Или я использую ключевое слово + индексный номер, назначенный каждому спрайту (например, button_1
, button_2
и т. Д.)?
Вот мой NewButton
класс:
import pygame
class NewButton:
"""Create and maintain a new button."""`
def __init__(self, name, sprites, x_pos, y_pos, size):
"""Initialise a new button instance.
:param name: The name of the button from the dictionary.
:param sprites: A dictionary of button sprite images.
:param x_pos: The x position of the button image.
:param y_pos: The y position of the button image.
:param size: The squared size of the button image.
"""
self.img_normal = sprites[name]
self.img_hover = sprites[name + '_hover']
self.img_click = sprites[name + '_click']
self.rect = pygame.Rect(x_pos, y_pos, size, size)
self.image = self.img_normal
self.hover = False
self.clicked = False
self.execute = False
self.max_timer = 20
self.click_timer = 0
def update(self, delta):
"""Update the button instance.
:param delta: A multiplier based on real time between updates.
"""
if self.clicked:
self.click_timer += delta
if self.click_timer < self.max_timer / 2:
self.image = self.img_click
elif self.click_timer >= self.max_timer:
self.clicked = False
self.click_timer = 0
self.image = self.img_normal
self.execute = True
else:
self.image = self.img_normal
else:
mx, my = pygame.mouse.get_pos()
if self.rect.collidepoint(mx, my):
self.image = self.img_hover
self.hover = True
else:
self.image = self.img_normal
self.hover = False
def click(self):
"""Set the button as being clicked."""
self.clicked = True
def reset(self):
"""Reset the execute status of the button."""
self.execute = False