XNA с использованием content.load XML всегда возвращает один и тот же объект?
Я пытаюсь использовать 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 ответ
Это по замыслу. В большинстве случаев вы хотите загрузить актив только один раз, а затем использовать его повторно. Загрузка его несколько раз была бы пустой тратой времени и памяти.
В идеале любые ресурсы, которые вы загружаете с диска, должны быть неизменяемыми объектами, поэтому вы должны изменить свой дизайн, чтобы вам не нужно было изменять их поля.
Но иногда это невозможно. Следующим лучшим решением будет внедрение ICloneable
в классе вы хотите сделать несколько копий.
Более трудная для реализации и некрасивая альтернатива будет наследовать от ContentManager
и переопределить его методы так, чтобы он каждый раз загружал ресурс, как описано в этом сообщении в блоге.