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();

            }

这就是它的保存方式,当我调用一个名为initial saves的前一个方法时,它会保存诸如分数之类的整数和诸如玩家位置之类的Vector2,但是,无论如何参考块位置会导致加载时没有任何事情发生(除了玩家位置更新和分数更新)。

如果这是在更新循环中,我可以像平常一样简单地计算对象:

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

        }

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

4

1 回答 1

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 应用程序相同的方式对其进行序列化。

于 2014-01-03T12:09:51.733 回答