1、入口文件: 

2、入口的HTML

3、run函数

初始化Main,并执行run函数

然后run方法里,执行loadMainScripts

在loadMainScirpt里,给window的load函数绑定了一个监听器

一旦加载完成之后,会initEffekseerRuntime()

然后这个Runtime被成功load的话会执行onEffeckseerLoad过程

接着看到onEffekseerLoad里

执行了两个方法,第一个是把Spinner()画面干掉

第二个就是整了这么多活儿之后的核心了:

                SceneManager.run(Scene_Boot)

然后这玩意要从两方面去理解:

第一是manager文件里的主控函数

我没有仔细看这东西,但看了几个插件的视频后,大概猜出来,它维护了一个队列,另外它的run函数里也启动了startGameLoop()

这个需要稍后去跟

初始化里,则是

依次:

1、检查了游览器兼容性;

2、检查了插件的错误;

3、初始化了图形;

4、初始化了声音环境;

5、初始化了视频;

6、初始化了输入

7、设置好了事件Handelers()

然后goto函数其实是一个非常简单粗暴的过程

就是把这个sceneClass初始化后,赋予this._nextScene这个私有指针

初始化的时候不是initGraphics了么,它干了一个事情

就是把:Graphics.setTickHandler(this.update.bind(this));

其实就是把SceneManager的update的函数的指针,传给了Graphics,作为Graphics实例的TickHandler

那么就看update

实际上就是决定一个RepeatNumber之后

再执行updateMain()

然后我们看到updateMain的逻辑是,更新了一个counter,更新了输入的数据,更新了特效

这三个都是游戏引擎感知外部,以及计算内部时钟的逻辑

这一段需要细读,反正刚才goto之后,就把入口的那个Scene_Boot赋予给了_nextScene,还记得么?

我感觉走一个断点或者console.log才能真正理解这一块的逻辑,反正Scene_Boot,这一顿折腾之后

会被某个if分支调用进入


this._exiting初始化的状态应该是false,对吧


所以会进入第一个分支

然后,this._scene是空的,不会执行,

会执行到下面一句

当前的this._scene会被赋予this._nextScene,也就是Scene_Boot

接着就会被连续调用

scenet的create方法

以及scene的onSceneCreate方法了

它的create方法先调用最大的基类的create方法

然后初始化了DataManager的loadDatabase()方法

紧接着,又调用了StorageManager的更新外键方法,这两个都稍后跟

接下来又跳回了Manager那边:

执行Manager的方法,这个暂时先不跟

执行完毕后

其实就开始

updateScene了

然后就应该是

调用start了

先检查玩家的位置信息

然后数据管理器setupNewGame(),这块是要跟的

然后Windows_titleCommand会initCommandPosition

啊哈?然后干了一件很有趣的事情,就是让场景管理器goto到Scene_Splash去

然后

你会发现Scene_Splash又会跳转到Scene_Title去

它比较特殊一些:

背景、前景、窗口和Command,初始化这四个

接着是清理SceneManager,调整背景,播放音乐,渐入

回到creat方法里

设置了三个handler

然后主要是看newGame

这里有一个this.addWindow这个方法稍后再看

数据库管理器,新建一个游戏,然后把命令窗口关掉

渐出

之后又让SceneManager跳转到了Scene_Map

接下来这里就是load地图了

然后它的start函数就很有趣了

这个Map场景相对复杂一些,可以认真看一下

基本上到这里,游戏引擎从启动到load 初始化的地图就算是溜了一遍了。。。