如何在XNA中序列化对象列表?

时间:2013-05-23 03:19:22

标签: c# xna-4.0

我有一个要添加到游戏中的块列表(有点像我的)我有一个工作序列化函数,但我很困惑如何保存每个的块位置对应列表。

例如,

    drive = StorageDevice.EndShowSelector(result);
        if (drive != null && drive.IsConnected)
        {

                SaveGame SaveData = new SaveGame()
                {
                    playerpos = player.playerPosition,
                    lvl = Level,
                    exp = Exp,
                    munny = Money,


                };
                IAsyncResult r = drive.BeginOpenContainer(containerName, null, null);
                //etc... etc..
                stream.Close();
                container.Dispose();
                result.AsyncWaitHandle.Close();

            }

这就是它保存的方式,当我调用之前称为启动的方法时,它会像分数一样保存内容,而像玩家的帖子一样保存Vector2s,但是,无论如何都要阻止阻塞位置,不会在加载时发生任何事情(除了玩家位置更新和分数更新)。

如果这是在更新循环中,我可以简单地计算正常的对象:

      for (int b = 0; b < game.blocklist.Count; b++)
        {
            //etc..
         }

然而,这不在更新循环中,我对发生的事情感到困惑。

编辑:为了使我的问题更清楚,我不知道如何序列化我的存储类中的列表

例如,这就是我通常在Games Contsructor中设置列表的方式:

    public List<Builder> blocklist = new List<Builder>();

然后我可以使用Builder类中的参数块添加到阻止列表中,如下所示,

    if (player.Builder == true && player.LMBpressed == true && blockspawnamount >= placeblock)
        {
            if (build.BlockID == 1)
            {

                position = new Vector2((int)(cursor.cursorPos.X / 58) * 58, (int)(cursor.cursorPos.Y / 58) * 58);

                blocktex1 = grass1;
                block = new Builder(this, blocktex1, new Vector2(position.X, position.Y));

                blocklist.Add(block);


                placeblock = 200.0f;
            }

        }

然后相应地更新阻止列表。现在我的问题是,我不知道如何保存阻止列表项位置的每个,以便可以根据命令再次加载它们。

1 个答案:

答案 0 :(得分:1)

我很惊讶这从未得到过回答,但我是否理解正确 - 您是在询问如何序列化块的列表(或数组)?

我的回答假设您的整个课程都是可序列化的:

如果要存储每个实体(例如您的块),则可以在列表中使用XMLArray()属性:

using System.Xml;
using System.Xml.Serialization;
using System.IO;

[Serializable()]
public class MyClass
{

    private list<blocks> m_Blocks = new List<block>();

    [XMLArray("Items")]
    public list<block> Blocks{ 
        get{ return m_blocks; }
        set{ m_Blocks = value; }
    };

    // ... other members
}

...只要对象中的所有字段都是可序列化的对象或值类型,它就应该有用。

之后,您可以使用System.XML.Serialization.XMLSerializer以与任何非XNA应用程序相同的方式对其进行序列化。