2012-03-12 57 views
0

我想使用一个xml文件作为spritesheet数据;我有一个框架类,它包含一个矩形或另一个框架列表(它可以是一个框架本身,或持有更多的框架)。 XML保存所有框架的矩形。 我已将xml添加到内容项目,并使用Content.load(“xmlname”)加载它。使用content.load的XNA XML总是返回相同的对象?

这一切使用它一次完美罚款。但是,当我创建共享相同spritesheet的2个对象(并且因此具有相同的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,但反序列化列表是一场噩梦。 我在这里做错了什么?似乎很奇怪,它返回相同的对象

回答

2

这是设计。在大多数情况下,您只需要加载一次资产,然后重新使用它。多次加载会浪费时间和内存。

理想情况下,从磁盘加载的任何资产都应该是不可变的对象,因此您应该更改设计,以便不需要修改其字段。

但有时这是不可能的。下一个最好的解决方案是在想要制作多个副本的课程上实施ICloneable

难以实现的正确和种类丑陋的替代方法是从ContentManager继承并覆盖其方法,使其每次加载资产,如this blog post中所述。

+0

啊我明白了。我通过序列化和反序列化对象来尝试克隆方法。但是这造成了列表中的许多问题。 感谢您的链接,它的确非常丑陋。但至少可以帮助我继续前进。 – omgnoseat 2012-03-13 15:09:28

+0

我刚刚实现了一个自定义的contentmanager,它效果很棒!我想看看是否有任何其他解决方案,但如果我没有获得任何解决方案,我会接受这种解决方案。 谢谢一堆 – omgnoseat 2012-03-13 16:04:55

相关问题