好的,所以我有一个精灵表,以及下面显示的xml文件中列出的所有精灵的位置:
<TextureAtlas imagePath="walkRight.png">
<SubTexture name="walkRightIdle.png" x="0" y="0" width="22" height = "28"/>
<SubTexture name="walkRight1.png" x="22" y="0" width = "22" height = "28"/>
<SubTexture name="walkRight2.png" x="44" y="0" width = "22" height = "28"/>
</TextureAtlas>
所以我想知道的是我如何选择在python中使用哪个图像,例如,如果我想使用精灵“walkRight1.png”我将如何在pygame中将其分配给有形的东西,所以我可以采取 - 导入x和y轴,宽度和高度,并使用它来选择我想要使用的spritesheet部分。
不确定这是否有意义,尝试以我想要的方式解析python中的xml让我的头受伤。
答案 0 :(得分:1)
我们一直在课堂上使用Kenny.nl艺术包,它们通常带有像你的例子一样的XML。通过将xml解析为字典,我们就是这样做的:
import xml.etree.ElementTree as ET
class SpriteSheet:
# load an atlas image
# can also pass an associated XML file (ref. Kenney art)
def __init__(self, img_file, data_file=None):
self.spritesheet = pg.image.load(img_file).convert_alpha()
if data_file:
tree = ET.parse(data_file)
self.map = {}
for node in tree.iter():
if node.attrib.get('name'):
name = node.attrib.get('name')
self.map[name] = {}
self.map[name]['x'] = int(node.attrib.get('x'))
self.map[name]['y'] = int(node.attrib.get('y'))
self.map[name]['width'] = int(node.attrib.get('width'))
self.map[name]['height'] = int(node.attrib.get('height'))
def get_image_rect(self, x, y, w, h):
return self.spritesheet.subsurface(pg.Rect(x, y, w, h))
def get_image_name(self, name):
rect = pg.Rect(self.map[name]['x'], self.map[name]['y'],
self.map[name]['width'], self.map[name]['height'])
return self.spritesheet.subsurface(rect)
加载spritesheet和xml文件(如果有的话),如下所示:
sheet = SpriteSheet("sheet.png", "sheet.xml")
然后您可以按名称或尺寸剪切图像:
img1 = sheet.get_image_name("walkRightIdle.png")
img2 = sheet.get_image_rect(0, 0, 22, 28)
请注意,没有错误检查或其他任何内容,因此假设您使用的是Kenny.nl艺术的XML格式。