【星火进阶教程02-构建完善的代码框架和云存档读取】

修改于2023/11/171231 浏览主题教程

一、前言

对于写过一些代码的兄弟来说,在准备写一个玩法和功能都足够充分的游戏上,如何构建一套稳定、强悍、易读的代码框架显得十分重要。下面从几个方面,就如果搭建一个功能模块进行一些深入浅出的探讨。
蓝色字体代表重要的内容,需要仔细思考和理解,同时一般描述文字在图标上面。

二、构建流程

我们以建立一张地图闯关为例,搭建一个功能模块。

1.新建文件夹

TapTap
总结构图
这一步十分的关键,它规划了你怎么如何按模块化的思维来构建一个功能模块。
我们不应该把事件、触发、类 等等数据统一放别的一个什么地方,而是应该按模块化思维放在一个文件夹下,代表这个文件夹下的事件、触发和类都是干的这个功能;这样当你的项目足够庞大的时候,你才可以方便的进行单个功能的调整、bug修复和新内容增加。
同时,一个类、一个事件、一个触发,都尽量代表了执行1-2个功能,把不同的功能,也尽量分成不同的文件来处理,不要怕文件变多,文件变多并不会影响游戏的速度,相反,文件越多,代表你的功能分工越明确。
在我所写的所有触发文件中,暂时没有超过2页的。

2.新建一个“单例”类

这一步非强制要求,但是如果你尝试过,你会理解其中带来的所有的好处。
TapTap
地图类的普通结构
2.1 创建一个地图类,然后创建一个成员变量,取名可以叫【单例】,以下是单例的初始化
TapTap
单例成员的初始化
单例的类型就是这个类本身同时初始化,并且把静态类型 Static 勾上,这样当服务器代码加载完毕之后,就会自动生成一个地图类的全局对象。
TapTap
地图类.单例
这个全局对象,可以在数编里的公式触发中调用,这是普通全局变量和全局函数不行的。
当然,既然是一个地图数据,你可能想到的就是地图难度、地图的挑战模式、地图是否通关等等一堆你可能要做的数据,这些数据不光要可以准确的和客户端沟通来显示UI,同时要可以安全的处理数据,最后要能进行合理的云变量的保存和读取

3.初始化数据

在单例中,构建一个【数据】成员,用来代表了游戏操作的所有相关地图数据,
TapTap
数据的结构
TapTap
数据类型可以是各种类型的,只需要满足你自己的需求就行了,我们这里的是地图,那么就是各种地图的不同数据,所以用一个简单表格式,简单表的key代表了地图名,value代表了每个地图的具体数据
有了数据结构,我们还需要进行初始化,代表了最初的游戏地图数据是什么。
TapTap
所以,我们新建一个初始化数据的成员函数,同时在类的构造器中,直接初始化执行这个函数
TapTap
TapTap
当所有内容做完之后,我们就有了最基本的地图数据方便调用
TapTap

4.数据的逻辑处理

当我们打开地图的时候,我们需要收到客户端打开UI的事件,然后传递相关地图数据,然后在地图通关之后,对玩家通关时选择的难度和通关情况进行数据保存。
这里关于客户端、服务器和UI相关的逻辑省略了....
TapTap
需要注意的是,对玩家传递过来的数据,可以进行数据验证,按照自身游戏的逻辑判定是否满足条件,就算在UI层面做了处理,这里仍然建议再做一次校验,如果发现数据不合理:比如客户端作弊,本来只能挑战难度1,结果挑战了难度2,那么这里校验错误,就不允许继续进行相关战斗后续逻辑

5.云存档和读取

这一块代码实际上比较复杂,需要有一定的基础和相关云变量的代码经验。
基本的逻辑为:游戏初始化开始,获取地图相关云变量,如果没有那么进行地图云变量的保存;如果存在,那么进行云变量的读取赋值。
看起简单,但是其中有很多细节要注意!!
由于我们保存地图数据可能存在于游戏的各个阶段,所以我们把这个功能写到 单例 里面,这样当我们通关地图、玩家首次游玩游戏等时机,就统一调用保存函数。
TapTap

5.1 云端数据加载

虽然云变量数据加载只在初始化的时候执行1次,但是中间存在比较隐晦的逻辑处理,所以单独说出来。
TapTap
我们保存云变量的时候,保存的整个地图数据的对象,这个对象是一个简单表,简单表的属性是另一个地图结构体对象,意思是这是一个比较复杂的结构,在云端是json格式保存的,中间的格式转换是在lua层面的table表进行转换的。
很多新手觉得,自己建立一个玩家存档数据,云变量的话,只需要读取和加载就行了;
实际上,需要考虑的还有【游戏的更新】,当我们游戏更新之后,存档数据会存在变动,可能新增成员,也可以减少成员,如果这时候读云变量数据并且直接赋值给本地,那么新增的数据就没了。
那我们怎么做才能确保我们新增数据的时候,尤其是给一个类新增成员的时候,使得加载云端数据变成正常呢?
答案就是:遍历我们的云端数据对象,对每一个对象单独进行进行赋值,这样就不会遍历到新增加的成员数据,也就等于不会覆盖新增成员数据(注意:如果我们这个类里面还有更多的类的对象,我们甚至需要再往里走一层,但是一般建立数据结构的时候,尽量不要做两层类结构)
我们这里遍历的是我们自己的类的对象,不是普通的结构数据,普通的比如:map,简单表,数组等,都有官方的的函数。
而自建的类的对象的遍历,我们需要做简单表的强制转换,类型全部写任意;如上图所示
这样做完之后,我们所有的数据就完成了:
1.数据初始化
2.数据逻辑处理
3.数据的云变量保存和读取
三个核心流程了
21
32
6