我正在尝试将spmlesheet数据用于xml文件;我有一个框架类,可以保存一个矩形或另一个框架列表(它可以是一个框架本身,或更多框架的持有者)。 xml保存帧的所有矩形。 我已将xml添加到内容项目中,并使用Content.load(“xmlname”)加载它。
使用一次时,这一切都完美无缺。但是当我创建两个共享相同spritesheet的对象(因此相同的xml数据文件)时,当这两个对象在同一帧上时,它们会消失。经过很多挫折后,我发现xml文件总是返回相同的对象,因此共享帧,因此它一次只能绘制一个帧。
这是xml文件的一小部分:
<?xml version="1.0" encoding="utf-8"?>
<rect>0 0 0 0</rect>
<frames>
<Item>
<rect>0 0 0 0</rect>
<frames>
<Item>
<rect>19 27 15 22</rect>
<frames></frames>
<label>DOWN</label>
</Item>
<Item>
<rect>2 27 15 23</rect>
<frames></frames>
<label>DOWN</label>
</Item>
<Item>
<rect>19 27 15 22</rect>
<frames></frames>
<label>DOWN</label>
</Item>
<Item>
<rect>36 27 15 23</rect>
<frames></frames>
<label>DOWN</label>
</Item>
</frames>
<label>DOWN</label>
</Item>
剥离了该类的版本:
public class Frame
{
public Rectangle rect; //means this is an image
private Renderable renderable = null;
private List<Frame> frames;
private Texture2D texture;
private int currentFrame = 0;
示例用法:
Sprite sprite1 = new Sprite();
sprite1.frame = Content.load<Frame>("xml");
sprite1.frame.getFrame(0).alpha = 0.5f;
Sprite sprite1 = new Sprite();
sprite2.frame = Content.load<Frame>("xml"); //<--- doesn't return a new object, returns the same object as sprite 1 uses
//frame 0 in sprite 2 has an alpha of 0.5 aswell, without having modified it
我尝试手动反序列化xml,但反序列化列表是一场噩梦。 我在这里做错了吗?看起来很奇怪,它返回相同的对象
答案 0 :(得分:2)
这是设计的。在大多数情况下,您只想加载一次资产,然后重复使用它。多次加载会浪费时间和记忆。
理想情况下,从磁盘加载的任何资产都应该是不可变对象,因此您应该更改设计,这样就不需要修改它们的字段。
但有时那是不可能的。下一个最佳解决方案是在要创建多个副本的类上实现ICloneable
。
难以实现正确且有点丑陋的替代方法是继承ContentManager
并覆盖其方法,以便每次加载资产,如this blog post中所述。