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 初始化的地图就算是溜了一遍了。。。