XNA с использованием content.load XML всегда возвращает один и тот же объект? - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь использовать XML-файл для данных таблицы спрайтов; У меня есть класс фреймов, который содержит прямоугольник или другой список фреймов (это может быть сам фрейм или держатель для большего количества фреймов). В XML хранятся все прямоугольники для фреймов. Я добавил xml в проект контента и использую Content.load ("xmlname") для его загрузки.

Все это прекрасно работает при однократном использовании. Но когда я создаю 2 объекта, которые совместно используют одну и ту же таблицу спрайтов (и, следовательно, одни и те же данные XML), они исчезают, когда эти 2 объекта находятся в одном кадре. После большого разочарования я понял, что 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 вручную, но десериализация списков - это кошмар. Я что-то здесь не так делаю? Кажется настолько странным, что он возвращает тот же объект

1 Ответ

2 голосов
/ 13 марта 2012

Это по замыслу.В большинстве случаев вы хотите загрузить актив только один раз, а затем использовать его повторно.Многократная его загрузка была бы пустой тратой времени и памяти.

В идеале любые ресурсы, загружаемые с диска, должны быть неизменяемыми объектами, поэтому вы должны изменить свой дизайн, чтобы вам не нужно было изменять их поля.

Но иногда это невозможно.Следующим лучшим решением было бы реализовать ICloneable в классе, для которого вы хотите сделать несколько копий.

Труднее правильно реализовать и уродливая альтернатива - наследовать от ContentManager ипереопределите свои методы так, чтобы он каждый раз загружал ресурс, как описано в этом сообщении в блоге .

...