RpgMakerMV源码解析(2)-启动过程

启动过程

今天宏观的讲解一下rpgmaker游戏框架的启动过程.

在main.js中,首先调用插件管理器加载了插件,然后使用场景管理器,加载了启动场景,

 

 

之后转到sceneManager.run方法,sceneManager是一个典型的延时初始化的类,他的init方法要等到第一次使用该类,即在run里面才会进行初始化。之后加载该场景类。

关于场景管理,这边简单说一下,很多引擎都有类似的东西,好处就是可以将资源打散到多个场景中,一次不用全部加载完毕,所以第一次可以更快的进入游戏,然后在逻辑上,将游戏分为多个场景也方便管理,特别是像RPG类型的游戏,简直是天生的容易分成多个场景,然后分成多个场景之后,在游戏开发的计划上,也可以以场景为基准,更加方便。

关于场景管理器的初始化,更深入的初始化部分就留下下次再说

 

在开启了主循环之后,就跳转到scene_boot,这个可以看成是scene类的一个子类,由场景管理器管理。

 

接下来因为场景管理器开启了帧循环,所以直接看场景管理器的update方法

可以看到,一个updateMain方法被夹在了两个计时方法中,这个用处就是为了算出一帧的执行时间,然后其他的一些处理就要依赖于这个执行时间,因为我们的一些逻辑处理都是要写在一个每帧执行的update里的。例如玩家的移动,但是不同配置的电脑1S可以执行的该方法次数不同,即帧数不同,因为要保证在1S真实时间内的移动相同,所以在移动的时候要乘上这个上一帧经过的时间作为参数。

类似这种不锁定单帧时间的,现在已经是大部分渲染框架和游戏引擎的标配了,毕竟这种可以充分发挥每台电脑的配置,配置越好的电脑帧数越高,画面越流畅,但是玩家1S可以移动的距离也是相同的,不会你电脑好一点就移动的快一点。

当然,为了达成这种效果,自然是需要游戏开发者多付出一些努力。

我还看过一些框架是锁帧的,包括以前的flash,甚至说unity的fixupdate都是锁帧的,这种的话就是编程起来方便一些。,因为每帧时间固定,需要考虑的事情也少了。

 

 

接下来我们看updateMain方法

首先是计算出了上一帧所使用的时间。其实这里有一个设计问题,一些关于时间的变量,方法,放在了sceneManager里面,其实应该再分出几个类,专门用来关于时间的计算和处理,肯定不能把帧循环时间处理放在场景管理器里。

 

然后的逻辑有点难看懂,其实就是一个锁定了帧数上下限的处理,上限60下限40。(但是这里的下限是有逻辑问题的。。因为帧数理论上是没有下限的,给你一台很垃圾的电脑跑高画质的游戏,你怎么可能弄一个帧数下限?所以一旦出现帧数实际上到达不了40帧的情况,会出现一些显示和逻辑问题,例如玩家可能实际移动不了应该1S内移动的距离,假设1S只能更新一帧,那么玩家只能移动一帧内能移动的距离,但是如果不加帧数下限的话,玩家会瞬移到应该1S内移动的距离,不会有中间动画,至于哪个处理好仁者见仁智者见智了,其实我是倾向于不设置帧数下限的。关于其他的这里就不多说了,延伸出来比较复杂,而且毕竟现在跑不动像素风rpg游戏的电脑应该很稀有了。)

关于while以上的部分,个人认为可以另外抽取出一个函数,不用写在这里。

然后先获取输入,之后分发循环事件,最重要的就是updateScene这一句了。

因为一个场景里会有很多的子物体,包括人物,地图,甚至说是抽象的UI界面,这些都是包括在一个scene里的,而他们的循环都是来自于scene上层的分发,scene会使用一个递归的查找,把整个循环链从高到底分发下去。

可以看到,最后循环来到了对应scene的update里,接下来具体要怎么循环,就是每个子scene各自的问题了。

 

scene_boot是一个加载的场景,他是没有重写scene的update方法的,那么实际调用到的就是下面这个基类的方法,即循环所有场景内的子物体

这些子物体各自在自己的循环里又会有不同的逻辑。

那么关于启动过程的分析就先到这里。


可以从我的github仓库获取我做的详细中文注释版的rpgmakermv源码进行学习,目前还在更新中 
https://github.com/luckyCatMiao/rpgmakermv-library-ChineseAnnotations

 

【实例教程1】怎样编写一个插件? 1. 插件的注释与定义参数 2. 读取插件参数 3. 插件指令的实现 【实例教程2】制作一个启动画面 1. 从哪里开始? 2. 创建启动画面的场景类 【实例教程3】玩转菜单初级篇 1. 给各个菜单界面添加背景 2. 让背景滚动起来 3. 在主菜单界面增加自定义菜单:改名 4. 在主菜单界面移除菜单命令 5. 在主菜单界面增加一个自定义窗口 【实例教程4】玩转标题画面 1. 美化游戏标题 2. 让背景动起来 3. 自定义标题菜单 4. 美化菜单 【实例教程5】制作小游戏:坦克大战(上) 1. 游戏结构及流程介绍 2. 相关素材资源的下载和使用 3. 基础知识:音效的播放 4. 基础知识:精灵表的切帧 5. 基础知识:使用MV中的动画 6. Scene_TankWarTitle类解析 7. Sprite_Bullet类解析 8. Sprite_Explode类解析 9. Sprite_Tank类解析 10. Sprite_Enemy类解析 11. Scene_TankWar类解析 12. Scene_TankWarGameOver类解析 【实例教程6】存档的加密解密与保护 1. 找出MV存档和读档的方式 2. 制作MV存档的修改器 3. 如何保护存档? 4. 制作一个存档保护插件 【实例教程7】制作一个传送插件 1. 传送插件的主要功能 2. 将自定义数据保存到存档中 3. meta数据的使用 4. 使用地图备注登记传送点 5. 在插件中解析并记录传送点 6. 使用地图备注登记多个传送点并在插件中记录 7. 制作传送点选取窗口显示传送点数据 8. 将物品或技能标记为传送物品、传送技能 9. 显示传送动画实现传送功能 10. 禁止使用传送道具或传送技能 11. 实现插件命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值