Как мне назначать имена спрайтам из листа спрайтов? - PullRequest
2 голосов
/ 01 июня 2019

Я знаю, как загрузить лист спрайта, обрезать изображения и вернуть список этих изображений, но мне нравится ссылаться на мои спрайты по имени, а не по индексу, чтобы сохранить код читабельным и управляемым, но иногда он длинный и утомительное написание списков имен спрайтов.

Я обычно создаю словарь и ссылаюсь на нужный мне спрайт по имени, но мне было интересно, стоит ли мне жестко кодировать имена?

Это то, что я обычно делаю:

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

Ответы [ 3 ]

2 голосов
/ 01 июня 2019

Вы можете сделать это проще, используя функцию 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 голос
/ 01 июня 2019

Прежде всего, вы должны учитывать, что pygame.sprite.Sprite в pygame.sprite.Group не заказаны. Не гарантируется, что спрайты перечисляются в том же порядке, когда их группа повторяется, так как они были добавлены в группу.
См. Документацию pygame.sprite.Group:

Спрайты в группе не упорядочены, поэтому рисование и повторение спрайтов происходит не в определенном порядке.


Я рекомендую определить enum с именами кнопок:

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

Создать словарь, в котором каждая кнопка связана с перечислителем:

spr_buttons = dict(zip(Button, sprites))

Таким образом, к кнопке можно получить доступ, например ::1010 *

sprite = spr_buttons[Button.start] 

или даже используя getattr и имя:

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

В качестве альтернативы вы можете создать список кнопок и доступа с помощью свойства .value перечислителя, которое является индексом списка:

spr_buttons = list(sprites)
sprite = spr_buttons[Button.start_hover.value]
0 голосов
/ 01 июня 2019

Вы можете использовать последовательность распаковки спрайтов, чтобы присвоить им имена, которые вы хотите использовать:

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
...