2012-03-12 7 views
0

私はスプライトシートのデータにxmlファイルを使用しようとしています。私は矩形またはフレームの別のリストを保持するフレームクラスを持っています(フレーム自体、またはそれ以上のフレームのホルダー)。 xmlはフレームのすべての矩形を保持します。 コンテンツプロジェクトにxmlを追加し、Content.load( "xmlname")を使用してロードしました。XNAはcontent.load XMLを使用して常に同じオブジェクトを返しますか?

これは一度使用すると完全に正常に動作します。しかし、同じスプライトシート(したがって同じxmlデータファイル)を共有する2つのオブジェクトを作成すると、これらの2つのオブジェクトが同じフレームにあるときに消滅します。私は多くの不満の後、xmlファイルは常に同じオブジェクトを返すので、フレームを共有するので、一度に1つのフレームしか描画できないことがわかりました。

ここで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; 

使用例:

xmlを手作業でデシリアライズしようとしましたが、リストのデシリアライズは悪夢です。 私はここで何か間違っていますか?それは同じオブジェクトを返すようにとても奇妙に見える

答えて

2

これは仕様です。ほとんどの場合、アセットを一度ロードしてから再利用したいだけです。複数回ロードすると時間とメモリが浪費されます。

ディスクからロードするアセットは不変オブジェクトである必要があります。したがって、フィールドを変更する必要がないようにデザインを変更する必要があります。

しかし、時にはそれは不可能です。次のベストソリューションは、複数のコピーを作成するクラスにICloneableを実装することです。

ContentManagerから継承し、そのメソッドをオーバーライドして、毎回アセットを読み込むようにするのは、実装が難しく、醜いです。this blog postに記載されています。

+0

わかりました。オブジェクトを直列化してデシリアライズしてクローンメソッドを試しました。しかしそれはリストの問題の多くを作り出しました。 あなたのリンクをありがとう、実際にはかなり醜いです。しかし少なくとも私は今のところ進歩を助けることができる何か。 – omgnoseat

+0

私はちょうどカスタムコンテンツマネージャを実装しました。私は何か別の解決策を得るかどうかを見たいと思っていますが、もし私が何も得られなければ、これをawnserとして受け入れます。 ありがとう – omgnoseat

関連する問題