有没有人有一个将精灵表与 XML 文件结合使用的示例

-1 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>
Run Code Online (Sandbox Code Playgroud)

所以我想知道如何在 python 中选择要使用的图像,例如,如果我想使用精灵“walkRight1.png”,我将如何将其分配给 pygame 中的有形物体,这样我就可以采取那 - 导入 x 和 y 轴、宽度和高度,并使用它来选择我想要使用的 spritesheet 部分。

不确定这是否有意义,尝试以我想要的方式解析 python 中的 xml 让我头疼。

小智 5

我们在课堂上一直使用 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)
Run Code Online (Sandbox Code Playgroud)

像这样加载 spritesheet 和 xml 文件(如果有的话):

sheet = SpriteSheet("sheet.png", "sheet.xml")
Run Code Online (Sandbox Code Playgroud)

然后您可以按名称或尺寸剪切图像:

img1 = sheet.get_image_name("walkRightIdle.png")
img2 = sheet.get_image_rect(0, 0, 22, 28)
Run Code Online (Sandbox Code Playgroud)

请注意,没有错误检查或任何其他操作,因此假设您使用的是 Kenny.nl 艺术中的 XML 格式。