2012-03-12 1 views
0

스프레드 시트 데이터에 XML 파일을 사용하려고합니다. 사각형 또는 다른 프레임 목록을 보유하는 프레임 클래스가 있습니다 (프레임 자체 또는 더 많은 프레임을위한 홀더가 될 수 있음). xml은 프레임의 모든 직사각형을 포함합니다. 콘텐츠 프로젝트에 xml을 추가하고 Content.load ("xmlname")를 사용하여로드했습니다.XNA는 content.load XML을 사용하여 항상 동일한 객체를 반환합니까?

한 번 사용하면 완벽하게 작동합니다. 그러나 같은 스프라이트 시트를 공유하는 두 개의 객체를 만들면 두 객체가 같은 프레임에있을 때 사라집니다. 많은 좌절감을 느낀 후에 xml 파일은 항상 동일한 객체를 반환하므로 프레임을 공유하므로 한 번에 한 프레임 씩 프레임을 그릴 수 있습니다.

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 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> 

클래스의 버전을 박탈 : 여기

는 XML 파일의 짧은 부분

XML을 수동으로 deserialize하려고했지만 목록을 비 직렬화하는 것은 악몽입니다. 내가 여기서 뭔가 잘못하고 있니? 이상한 것처럼 보입니다. 동일한 객체를 반환합니다.

답변

2

이것은 의도적으로 설계된 것입니다. 대부분의 상황에서 자산을 한 번만로드 한 다음 다시 사용하려고합니다. 여러 번로드하면 시간과 메모리가 낭비됩니다.

이상적으로 디스크에서로드하는 모든 에셋은 변경 불가능한 객체 여야하므로 필드를 수정하지 않아도되도록 디자인을 변경해야합니다.

하지만 때때로 불가능합니다. 다음으로 가장 좋은 해결책은 여러 복사본을 만들려는 클래스에 ICloneable을 구현하는 것입니다.

구현하기가 어렵고 정확하지 않은 추악한 대안은 this blog post에 설명 된대로 ContentManager에서 상속하고 매 번 자산을로드하는 방법을 재정의하는 것입니다.

+0

아하겠습니다. 개체를 직렬화 및 비 직렬화하여 복제 방법을 시도했습니다. 그러나 그것은 목록에 많은 문제를 야기했습니다. 링크를 제공해 주셔서 감사합니다. 그러나 적어도 지금은 내가 나아갈 수있는 어떤 것. – omgnoseat

+0

방금 ​​custommanagermanager를 구현했으며 훌륭하게 작동합니다! 대안 솔루션을 얻는 지보고 싶지만 아무 것도 얻지 못하면 이것을 awnser로 받아 들일 것입니다. 감사합니다. – omgnoseat