0

我正在尝试将 xml 文件用于 spritesheet 数据;我有一个框架类,它要么包含一个矩形,要么包含另一个框架列表(它可以是一个框架本身,也可以是更多框架的持有者)。xml 包含框架的所有矩形。我已将 xml 添加到内容项目并使用 Content.load("xmlname") 加载它。

使用一次时,这一切都很好。但是,当我创建 2 个共享相同 spritesheet 的对象(以及因此相同的 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,但反序列化列表是一场噩梦。我在这里做错了吗?看起来很奇怪,它返回相同的对象

4

1 回答 1

2

这是设计使然。在大多数情况下,您只想加载一次资产,然后重复使用它。多次加载它会浪费时间和内存。

理想情况下,您从磁盘加载的任何资产都应该是不可变对象,因此您应该更改您的设计,这样您就不需要修改它们的字段。

但有时这是不可能的。下一个最佳解决方案是ICloneable在要制作多个副本的类上实现。

更难正确实现且丑陋的替代方案是继承ContentManager并覆盖其方法,以便每次都加载资产,如本博文中所述。

于 2012-03-13T01:32:08.100 回答