有没有人有一个使用精灵表与XML文件串联的例子

时间:2017-08-05 22:44:56

标签: python xml pygame

好的,所以我有一个精灵表,以及下面显示的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让我的头受伤。

1 个答案:

答案 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格式。

相关问题