2012-03-12 58 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

相關問題