Вызываемый класс таблицы спрайтов для любой таблицы спрайтов - PullRequest
0 голосов
/ 21 июня 2020

Мне было интересно, как бы вы закодировали класс в python, который при вызове будет циклически проходить через любой лист спрайтов. Например, если была вызвана таблица спрайтов (таблица спрайтов, x, y), данная таблица спрайтов будет циклически просмотрена и появится с заданными координатами?

1 Ответ

0 голосов
/ 21 июня 2020

Важно только ехать на велосипеде, чтобы получить следующее изображение. Отображение не важно, если вы знаете, как получить следующее изображение.

Это не проблема для одиноких spritesheet. Вы сохраняете данные и текущий индекс в классе и используете метод, который получает элемент из текущего индекса, увеличивает его, и если он больше, чем длина данных, он устанавливает current = 0

class Cycler():

    def __init__(self, spritesheet):
        self.spritesheet = spritesheet
        self.lenght = len(self.spritesheet)
        self.current = 0
        
    def next(self):
        value = self.spritesheet[self.current]
        
        self.current += 1
        if self.current == self.length:
            self.current = 0

        # OR
        #self.current = (self.current + 1) % self.length
      
        return value

spritesheet = ["A", "B", "C"]
cycler = Cycler(spritesheet)

for x in range(5):
    for y in range(5):
        print(x, y, cycler.next())

Результат:

0 0 A
0 1 B
0 2 C
0 3 A
0 4 B
1 0 C
1 1 A
1 2 B
1 3 C
1 4 A
2 0 B
2 1 C
2 2 A
2 3 B
2 4 C
3 0 A
3 1 B
3 2 C
3 3 A
3 4 B
4 0 C
4 1 A
4 2 B
4 3 C
4 4 A

То же, что и с itertools.cycle

import itertools

spritesheet = ["A", "B", "C"]
cycler = itertools.cycle(spritesheet)        
            
for x in range(5):
    for y in range(5):
        print(x, y, next(cycler))

Если вам нужно больше таблиц спрайтов, вы можете создать больше циклов

import itertools

spritesheet1 = ["A", "B", "C"]
cycler1 = itertools.cycle(spritesheet1)

spritesheet2 = ["X", "Y", "Z"]
cycler2 = itertools.cycle(spritesheet2)        
            
for x in range(5):
    for y in range(5):
        if x % 2:
            print(x, y, next(cycler2))
        else:
            print(x, y, next(cycler1))

Результат:

0 0 A
0 1 B
0 2 C
0 3 A
0 4 B
1 0 X
1 1 Y
1 2 Z
1 3 X
1 4 Y
2 0 C
2 1 A
2 2 B
2 3 C
2 4 A
3 0 Z
3 1 X
3 2 Y
3 3 Z
3 4 X
4 0 B
4 1 C
4 2 A
4 3 B
4 4 C
...