任何 spritesheet 的可调用 spritesheet 类

Posted

技术标签:

【中文标题】任何 spritesheet 的可调用 spritesheet 类【英文标题】:Callable spritesheet class for any spritesheet 【发布时间】:2020-10-10 23:59:48 【问题描述】:

我想知道你将如何在 python 中编写一个类,当调用它时会循环遍历任何精灵表。例如,如果调用 Spritesheet(spritesheet, x, y),则给定的 sprite sheet 将循环通过并出现在给定的坐标处?

【问题讨论】:

使用实例变量来保持当前的精灵,并在每次执行时改变这个变量。当你去最后一个精灵时,你设置第一个精灵。最终可能有itertools.cycle() 问题只是骑自行车。显示并不那么重要。 你的意思是用不同的spritesheet 运行同一个类是什么意思?但是每个spritesheet 可能有不同数量的元素。或者也许对于每个spritesheet,您需要单独的循环?那么spritesheet应该是可以循环的类的实例 【参考方案1】:

重要的是仅循环获取下一张图片。当您知道如何获取下一张图片时,显示并不重要。


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

如果您需要更多 spritesheets,那么您可以创建更多循环器

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

【讨论】:

以上是关于任何 spritesheet 的可调用 spritesheet 类的主要内容,如果未能解决你的问题,请参考以下文章

接受任何类型的可调用并且知道参数类型

异常:可调用语句未返回任何值

easelJS - 使用 Javascript 调整图像大小,然后将其与 SpriteSheet 一起使用

Windows Phone 应用程序中的 SpriteSheet 动画

在 Tkinter 中使用 Spritesheets

PreloadJS getResult(spriteSheet)