python - 任何 spritesheet 的可调用 spritesheet 类
问题描述
我想知道你将如何在 python 中编写一个类,当调用它时会循环遍历任何精灵表。例如,如果 Spritesheet(spritesheet, x, y) 被调用,给定的 sprite sheet 将被循环并出现在给定的坐标处?
解决方案
重要的是只有骑自行车才能获得下一张图像。当您知道如何获取下一张图像时,显示并不重要。
单身没问题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
推荐阅读
- angular - 从 json 创建动态表单时出错找不到名称为“数据”的控件
- java - 带有返回 ArrayList 的方法的 @MethodSource 的参数化 JUnit 测试
- react-native - react-native create 应用程序在创建时挂起
- javascript - 使用 fastify-multer 上传图片时出错
- python - pyqt中的切换按钮
- excel - 在 2 张纸上匹配多个标准并从 excel 中的匹配中提取一些数据
- java - 为什么 TextToSpeech synthesizeToFile 返回 -1?
- node.js - Node.js PayUMoney 集成 - response.headers.location 未定义
- angular - 访问有关图表 js 实例和组件变量的数据
- encoding - 解密http响应