第四十三节 读档

有了存档之后,我们就可以读取上一次游戏记录了。

01.添加读档方法

首先需要在导演类添加一个成员变量来存储读档的数据:

Archive _archive;           // 存档数据

然后添加方法:

// 读档 - 将硬盘数据读取至档案
void ReadArchive()
{
    // 判断是否有存档文件
    if (!File.Exists("GameSave.bin")) return;

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("GameSave.bin", FileMode.OpenOrCreate, File-Access.Read, FileShare.Read);
    _archive = (Archive)formatter.Deserialize(stream);
    stream.Close();
}
02.何时读档

在游戏开始之前,在Start()方法中:

void Start()
{
    ReadArchive();
    bool initSuccess = InitGame();

    // 启动定时器,执行游戏核心逻辑
    if (initSuccess) InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);
}
03.恢复上一次游戏

目前只是把上一次的存档写入了档案,还需要把这些数据赋给成员变量才行。通过修改InitGame()来实现:

// 在这里恢复上一次游戏
if (_archive != null)
{
    // 恢复固定图层数据
    _defaultLayer.ViewData = _archive.fixedPoints;
            
    // 恢复方块
    _blockLayer.Point = _archive.blockLayerPoint;
    _currentBlockType = (EBlockType)_archive.blockType;
    _blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);

    _nextBlockType = (EBlockType)_archive.nextBlockType;
    _screenAttachedScript.GetLayer("DefaultLayer").ViewData = BlockCrea-tor.GetInstance().CreateBlock(_nextBlockType);

    // 恢复分数
    _currentScore = _archive.score;
    _highScore = _archive.highScore;
    _currentScoreScript.SetScore(_currentScore);
    _highScoreScript.SetScore(_highScore);

    // 暂停游戏
    _paused = true;
    InvokeRepeating("BlinkPauseHint", 0, 0.2f);
}

之所以在恢复游戏后暂停,是为了让你在游戏开始前做好充分准备,如果不这么做,在游戏等级高的时候,就容易手忙脚乱。

04.测试及注意点

这是正确情况下读取的存档结果:



注意,请不要消除方块时关闭游戏,目前还没有对消除进程做存档,所以如果在消除时关闭了游戏,那么下次打开后,游戏就会出错,如下所示:



要知道,分数的最后一位不可能不是0。

你可能感兴趣的:(第四十三节 读档)