为什么这样设计游戏存档功能BUG比较少?

点击上方亿元程序员+关注和★星标

引言

大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。

本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。

游戏中的存档功能我们可以利用设计模式中的备忘录模式完成,BUG还比较少

在游戏开发过程中,我们经常会遇到需要保存和恢复对象状态 的场景。为了解决这个问题,我们可以使用备忘录模式 。那么,什么是 备忘录模式?它有哪些优点 ?又该如何在游戏开发中使用呢?本文将为您详细介绍。

本文源码和源工程在文末获取,小伙伴们自行前往。

什么是备忘录模式?

备忘录模式(Memento Pattern)是一种行为型设计模式 ,它通过创建一个备忘录来存储对象的内部状态 ,以便在需要时恢复 对象的状态。这种模式主要用于避免对象状态的频繁变化,从而提高性能。

它主要包含三个角色:发起人 (Originator)、备忘录 (Memento)和负责人(Caretaker)。

备忘录模式的优点

  1. 简化了对象的状态管理:备忘录模式将复杂的状态管理过程封装在备忘录类中,使得客户端代码更加简洁。

  2. 提高了代码的可读性和可维护性:通过使用备忘录模式,我们可以将对象的状态恢复逻辑与业务逻辑分离,使得代码更加清晰易懂。

  3. 降低了系统的耦合度:备忘录模式使得对象的状态恢复过程与客户端代码解耦,降低了系统之间的依赖关系。

如何在游戏开发中使用备忘录模式设计存档功能?

在游戏开发中,我们经常需要保存和恢复游戏关卡、角色状态等对象的状态。以下是一个简单的示例,展示了如何在游戏开发中使用备忘录模式。

1.备忘录类

首先 定义一个备忘录类,用于存储 发起人的内部状态。备忘录通常包含 一个或多个属性,用于表示 发起人的状态。同时,备忘录可以防止 发起人以外的其他对象访问 其内部状态。这里我们存储兔子的坐标

2.发起人类

然后 定义一个发起人类,用于记录 当前时刻的内部状态,并负责定义 哪些属于备份范围的状态。此外,发起人还需要负责创建 备忘录以及使用 备忘录恢复状态。这里我们负责创建兔子坐标的备忘录信息恢复兔子的坐标信息

3.负责人类

最后 定义一个负责人类,负责保存 备忘录,但并不对 备忘录的内容进行操作或检查 。负责人提供 保存与获取备忘录的功能,使得在需要的时候可以恢复 发起人的某一历史状态 。这里负责保存和恢复兔子坐标的备忘录信息。

4.测试代码

今天我们的主角是一只兔子 ,按照惯例加载兔子并且播放动画 ,然后我们创建一个发起人Originator以及负责人Caretaker

然后添加交互事件 :包括兔子的拖拽效果 ,改变兔子的位置,以及键盘事件 s保存和r恢复。

5.结果演示

首先我们通过鼠标拖拽兔子到不同的位置 ,同时通过键盘s记录每个位置的坐标信息

然后通过键盘r将兔子恢复到前面逐个记录的位置

通过以上示例 ,我们可以看到,在游戏开发中使用备忘录模式可以有效地简化对象状态的管理,提高代码的可读性和可维护性 。同时,备忘录模式还可以降低系统之间的耦合度 ,使得代码更加灵活和易于扩展

结语

在哪里 可以看到如此清晰的思路,快跟上我的节奏!关注我 ,和我一起了解 游戏行业最新动态,学习游戏开发技巧。

本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

8年主程手把手打造Cocos独立游戏开发框架

从零开始开发贪吃蛇小游戏到上线系列

游戏开发的技巧、心得、资讯

关注我,发送"备忘录模式"获取源码和源工程。

点击下方绿色按钮+关注

相关推荐
m0_748247551 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
m0_748255022 小时前
前端常用算法集合
前端·算法
真的很上进2 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web130933203982 小时前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_2342 小时前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
如若1233 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
滚雪球~4 小时前
npm error code ETIMEDOUT
前端·npm·node.js
沙漏无语4 小时前
npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
supermapsupport4 小时前
iClient3D for Cesium在Vue中快速实现场景卷帘
前端·vue.js·3d·cesium·supermap
brrdg_sefg4 小时前
WEB 漏洞 - 文件包含漏洞深度解析
前端·网络·安全