好的,我有一个精灵表,以及 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 格式。
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |