我有一个要添加到游戏中的块列表(有点像我的)我有一个工作序列化函数,但我很困惑如何保存每个的块位置对应列表。
例如,
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;
}
}
然后相应地更新阻止列表。现在我的问题是,我不知道如何保存阻止列表项位置的每个,以便可以根据命令再次加载它们。
答案 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应用程序相同的方式对其进行序列化。