第四十二节 存档

作者: 安静的程序员 | 来源:发表于2019-06-26 07:38 被阅读0次
    01.存档实现方式

    将需要保存的数据存储在一个类中,存档时,将此类序列化为二进制数据保存在存档文件中。

    02.创建存档数据类

    在脚本文件夹中添加类:Archive,该类是纯数据,因需要序列化,所以要在类声明处添加[Serializable]。

    03.确定需要保存的数据
    • 首先是固定图层上的方块数据;
    • 然后是方块类型:当前方块类型和下一个方块类型;
    • 方块坐标,读档时从保存的坐标处开始下落方块;
    • 当前分数和历史最高分;

    关卡是可以根据分数来确定的,所以不需要保存。

    下面是具体成员:

    // 固定图层数据
    public List<MyPoint> fixedPoints;
    // 当前方块类型
    public int blockType;
    // 下一个方块类型
    public int nextBlockType;
    // 方块图层坐标
    public MyPoint blockLayerPoint;
    // 分数
    public int score;
    // 最高分
    public int highScore;
    

    在构造方法中初始化值:

    public Archive()
    {
        fixedPoints = new List<MyPoint>();
        blockType = 0;
        nextBlockType = 0;
        blockLayerPoint = new MyPoint(0, 0);
        score = 0;
        highScore = 0;
    }
    
    04.添加存档方法

    在导演类中添加存档方法:

    // 存档
    void SaveArchive()
    {
        Archive archive = new Archive();
    
        // 固定图层数据
        if (_defaultLayer.ViewData.Count > 0)
        {
            archive.fixedPoints = new List<MyPoint>();
            foreach (var item in _defaultLayer.ViewData)
            {
                archive.fixedPoints.Add(new MyPoint(item._line, item._list));
            }
        }
        // 当前方块类型
        // archive.blockType = 0;
        // 下一个方块类型
        archive.nextBlockType = (int)_nextBlockType;
        // 方块图层坐标
        archive.blockLayerPoint._line = _blockLayer.Point._line;
        archive.blockLayerPoint._list = _blockLayer.Point._list;
        // 分数
        archive.score = _currentScore;
        // 最高分
        archive.highScore = _highScore;
    
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream("GameSave.bin", FileMode.Create, FileAccess.Write, FileShare.None);
        formatter.Serialize(stream, archive);
        stream.Close();
    }
    

    存档方法需要引入以下命名空间:

    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    

    在该方法中,存储当前方块类型被注释掉了,因为在导演类中缺少该值,所以需要添加一个成员并存储当前方块类型:

    EBlockType _currentBlockType;   // 当前方块类型
    

    在初始化游戏和生成方块中,为当前方块类型赋值:

    // 添加初始方块
    _blockLayer.Point = new MyPoint(20, 4);
    _currentBlockType = BlockCreator.GetInstance().RandomBlockType();
    _blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
    
    // 使用上一次生成的类型创建方块
    _currentBlockType = _nextBlockType;
    _blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
    

    然后将存档方法中的注释删除:

    // 当前方块类型
    archive.blockType = (int)_currentBlockType;
    // 下一个方块类型
    archive.nextBlockType = (int)_nextBlockType;
    
    05.执行存档

    在执行之前,需要为MyPoint结构体也添加[Serializable],否则无法成功序列化,你需要添加System引用才能使用此特性。

    存档的时机,我选择的是在游戏退出前进行存档:

    // 游戏退出时调用
    private void OnApplicationQuit()
    {
        SaveArchive();
    }
    
    06.测试

    运行游戏,随便下落几个方块后,停止游戏。如果存档没有问题的话,应该会在游戏的根目录(或项目根目录)下生成“GameSave.bin”:


    代码链接:https://pan.baidu.com/s/1W7zc9ycMGwmW3ipbKAvuGg
    提取码:a5c6

    相关文章

      网友评论

        本文标题:第四十二节 存档

        本文链接:https://www.haomeiwen.com/subject/svqqcctx.html