Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保存玩家状态C#_C# - Fatal编程技术网

保存玩家状态C#

保存玩家状态C#,c#,C#,我终于在C#Visual Studio 2013中完成了我的Rpg游戏。这仍然是要做的最后一件事: 将我的玩家统计数据和inventary(在玩家类内部)保存到一个文件中,以便稍后重新加载,并从该经验和级别继续游戏。我是个初学者,真的不知道如何和在哪里序列化东西。我的游戏rpg文本游戏仅在玩家统计数据和我的玩家库存中的物品上链接,所以我需要保存这些东西。问题来了。我将写一个简短版本的代码,让你了解我的rpg是如何组织的,让你帮助我的代码,我必须插入保存东西 现在只有两个简单的类。 我在我的项目目

我终于在C#Visual Studio 2013中完成了我的Rpg游戏。这仍然是要做的最后一件事: 将我的玩家统计数据和inventary(在玩家类内部)保存到一个文件中,以便稍后重新加载,并从该经验和级别继续游戏。我是个初学者,真的不知道如何和在哪里序列化东西。我的游戏rpg文本游戏仅在玩家统计数据和我的玩家库存中的物品上链接,所以我需要保存这些东西。问题来了。我将写一个简短版本的代码,让你了解我的rpg是如何组织的,让你帮助我的代码,我必须插入保存东西

现在只有两个简单的类。 我在我的项目目录中有我的解决方案“THE_GAME”,其形式为“GAME”,然后我添加了一个名为“Engine”的新类库,并为我的项目THE_GAME添加了“Engine”广告引用,因此我的游戏在Engine项目中使用代码。在引擎中,我有很多类…但现在,在一段简短的代码中,我想谈谈“玩家”和“魔术师”类。引擎中的此类为“短版本”:

魔术师班

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Engine
{
    public class Magicians
    {

        public int Hp { get; set; }
        public int Defense { get; set; }

public Magicians(int hp, int defense){
            Hp = hp;
            Defense = defense;
球员级别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Engine
{
    public class Player : Magicians
    {


        public int ExpPoints { get; set; }
        public int hp {get;set;}
        public List<InventoryItem> Invetory { get; set; }
        public int Level
        {
            get { return ((ExpPoints / 1000) + 1); }
        }

public Player(int exppoints, int hp,int level) : base(hp, defense){

ExpPoints = expoints;
Inventory = new List<InventoryItem>();
}
好吧…现在请遵循所有作战功能代码等。。。。
好的,我的游戏运行得很好。在游戏过程中,我需要做什么才能将我的玩家统计数据(hp exp物品清单)保存到文件中?我必须将
[Serializable]
标记放在哪里?魔术师还是所有的职业?那好吧?代码是什么?我必须将代码保存到哪里?

查看Microsoft Support的这篇文章:“如何使用Visual C将对象序列化为XML”—这里介绍了如何将对象序列化为XML—这是序列化的一种形式。当然还有其他选择

一旦有了序列化对象,就可以将结果保存到文件中

例如:

Player myPlayer = new Player();
using (StreamWriter writer = File.CreateText("player.xml"))
{
    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(myPlayer.GetType());
    x.Serialize(writer, myPlayer);
}

查看Microsoft支持部门的这篇文章:“如何使用Visual C#将对象序列化为XML”-这里介绍了如何将对象序列化为XML-这是序列化的一种形式。当然还有其他选择

一旦有了序列化对象,就可以将结果保存到文件中

例如:

Player myPlayer = new Player();
using (StreamWriter writer = File.CreateText("player.xml"))
{
    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(myPlayer.GetType());
    x.Serialize(writer, myPlayer);
}

优质催化剂的答案很好;下面是一个补充类,它将有助于对任何要序列化和/或反序列化的类重新使用此方法:)

使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml.Serialization;
//用法:
//要序列化可序列化类,请执行以下操作:
//字符串序列化=XMLManager.Save(classInstance);
//要从序列化字符串反序列化可序列化类,请执行以下操作:
//ClassToSerialize classInstance=XMLManager.Load(serializedString);
公共静态类XMLManager
{
公共静态字符串保存(T数据)
{
XmlSerializer xml=新的XmlSerializer(typeof(T));
StringWriter write=新建StringWriter();
序列化(写入、数据);
返回write.ToString();
}
公共静态T加载(字符串xmlString),其中T:class
{
尝试
{
StringReader扩展流=新StringReader(xmlString);
XmlSerializer xml=新的XmlSerializer(typeof(T));
返回(T)xml.Deserialize(扩展);
}
捕获(例外e)
{
//这里出错
抛出新异常(“XMLManager捕获了异常!”,e);
}
}
}

优质催化剂的答案很好;下面是一个补充类,它将有助于对任何要序列化和/或反序列化的类重新使用此方法:)

使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml.Serialization;
//用法:
//要序列化可序列化类,请执行以下操作:
//字符串序列化=XMLManager.Save(classInstance);
//要从序列化字符串反序列化可序列化类,请执行以下操作:
//ClassToSerialize classInstance=XMLManager.Load(serializedString);
公共静态类XMLManager
{
公共静态字符串保存(T数据)
{
XmlSerializer xml=新的XmlSerializer(typeof(T));
StringWriter write=新建StringWriter();
序列化(写入、数据);
返回write.ToString();
}
公共静态T加载(字符串xmlString),其中T:class
{
尝试
{
StringReader扩展流=新StringReader(xmlString);
XmlSerializer xml=新的XmlSerializer(typeof(T));
返回(T)xml.Deserialize(扩展);
}
捕获(例外e)
{
//这里出错
抛出新异常(“XMLManager捕获了异常!”,e);
}
}
}

听起来像是一份工作!听起来像是一份工作!这可以作为一个评论,而不一定是一个答案。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。谢谢@NKN。添加了代码示例。首先,谢谢大家。这里的事情可能需要向我解释。这个由Quality Catalyst发布的代码必须添加到我的魔术师名称类中吗?因为在这个类中,我已经为我的玩家创建了一个距离:_player=newplayer(0100,1)。问题是玩家_Player=新玩家();与_player=新玩家(0100,1)相同吗?如果我创建播放器_Player=newplayer();代码行程序向我发送一个错误,如“Player不包含0个参数构造”-->我必须在Player中更改我的\u Player(0100,1)\u Player=new Player(0100,1)@eugeniolivieri:该示例显示了一种可能的解决方案。不过它相当难看。我将实现一个独立的(可测试的)组件来进行序列化,另一个用于保存和加载播放器数据。需要从业务工作流中调用序列化组件,在该工作流中可以使用播放器数据。获得序列化结果后,将其发送到保存该结果的组件。关于你的问题:我不知道sav的触发器来自哪里
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

//USAGE:

//To Serialize a Serializable class:
    //string serialized = XMLManager.Save<ClassToSerialize>(classInstance);

//To Deserialize a Serializable class from a serialized string:
    //ClassToSerialize classInstance = XMLManager.Load<ClassToSerialize>(serializedString);

public static class XMLManager
{
    public static string Save<T>(T data)
    {
        XmlSerializer xml = new XmlSerializer(typeof(T));
        StringWriter write = new StringWriter();
        xml.Serialize(write, data);

        return write.ToString();
    }

    public static T Load<T>(string xmlString) where T : class
    {
        try
        {
            StringReader outStream = new StringReader(xmlString);
            XmlSerializer xml = new XmlSerializer(typeof(T));
            return (T)xml.Deserialize(outStream);
        }
        catch (Exception e)
        {
            //error here
            throw new Exception("XMLManager caught an Exception!", e);
        }
    }
}