【RPGツクールMZ】タイトル画面表示の辺りまでの処理を追ってみる
概要
RPGツクールMZのゲーム起動からタイトル画面までの処理を追っていく。
- 手元にRPGツクールMZがある(ソースコードを見れる)人向け。
- 流れを把握するのが目的なので、主に正常系を確認し、メソッド内の処理を深く追わないことがある。
環境
RPGMZ 1.0.2
index.html
1. body
要素内でjs/main.js
を読み込む。
<script type="text/javascript" src="js/main.js"></script>
js/main.js
(スクリプト読込前)
2. Main
オブジェクトを作成し、run
メソッドを実行する。
const main = new Main();
main.run();
run
メソッドでは、以下のメソッドを実行する。
showLoadingSpinner
testXhr
loadMainScripts
Main.showLoadingSpinner
2.1. ローディング表示(読み込み中のぐるぐる回るやつ)をbody
要素に追加する。
Main.testXhr
2.2. XMLHttpRequest
が動くかのテスト?🤔
Main.loadMainScripts
2.3. scriptUrls
配列のURLの数だけbody
要素にscript
要素を追加する。
追加されたscript
要素は、URLの読み込みが終わる毎にonScriptLoad
メソッドを実行する。onScriptLoad
メソッドでは、スクリプトが全て読み込まれていた場合にPluginManager.setup
を実行する。
PluginManager
(js/rmmz_managers.js
)
3.
PluginManager.setup
3.1 プラグインの数だけbody
要素にscript
要素を追加する。
js/main.js
(スクリプト読込後)
4. Main.onWindowLoad
をイベントリスナーに登録する。
Main.onWindowLoad
4.1. Main.initEffekseerRuntime
メソッドを実行する。
Main.initEffekseerRuntime
4.1.1. effekseer.initRuntime
メソッドを実行する。
読み込み後にMain.onEffekseerLoad
メソッドを実行する。
Main.onEffekseerLoad
4.1.1.1. Main.eraseLoadingSpinner
メソッド(ローディング画面を終了する)を実行した後、SceneManager.run
メソッドを実行する。
5. SceneManager (js/rmmz_managers.js)
SceneManager.run
5.1. 以下のメソッドを実行する。
SceneManager.initialize
SceneManager.goto
Graphics.startGameLoop
SceneManager.initialize
5.1.1. SceneManager
の初期化を行うため、以下のメソッドを実行する。
checkBrowser
checkPluginErrors
initGraphics
initAudio
initVideo
initInput
setupEventHandlers
SceneManager.checkBrowser
5.1.1.1. 使用しているブラウザでプログラムの実行に問題がないか確認する。
SceneManager.checkPluginErrors
5.1.1.2. 導入したプラグインでエラーが発生していないか確認する。
SceneManager.initGraphics
5.1.1.3. 描画周りの初期化を行う。
5.1.1.3.1. Graphics.setTickHandler
このメソッドの引数に取った関数(メソッド)をGraphics._tickHandler
に格納する。格納された関数はPIXI.Application
オブジェクトのticker
に追加され、レンダリングの更新時に関数が実行されるようになる?🤔
ざっくり書くとSceneManager.update
が繰り返し実行されるようになる。
SceneManager.initAudio
5.1.1.4. 音声系の初期化を行う。
SceneManager.initVideo
5.1.1.5. 動画系の初期化を行う。
SceneManager.initInput
5.1.1.6. 入力系の初期化を行う。
Input.initialize();
TouchInput.initialize();
Input
はキーボードとゲームパッドの入力、TouchInput
はマウスとタッチスクリーンの入力を受け持つ。
SceneManager.setupEventHandlers
5.1.1.7. イベントリスナーの登録を行う。
SceneManager.goto
5.1.2. SceneManager.run
の引数に渡されたScene_Boot
(js/rmmz_scenes.js
)オブジェクトを作成する。
SceneManager.update
5.1.3. SceneManager.updateMain
を実行する。
SceneManager.updateMain
5.1.3.1 以下のメソッドを実行する。
SceneManager.updateFrameCount
SceneManager.updateInputData
SceneManager.updateEffekseer
SceneManager.changeScene
SceneManager.updateScene
5.1.3.1.1 SceneManager.updateFrameCount
合計フレーム数を更新している?(ドキュメントにtotal frame
とあるので、ゲーム起動からのフレーム数?🤔)
5.1.3.1.2 SceneManager.updateInputData
Input
とTouchInput
の状態を更新する。
5.1.3.1.3 SceneManager.updateEffekseer
Effekseerの状態を更新する。
5.1.3.1.4 SceneManager.changeScene
条件を満たした時、に_nextScene
に格納されているオブジェクトを_scene
に格納し、create
メソッドを実行する。
5.1.3.1.5 SceneManager.updateScene
Scene_Boot
のstart
メソッドを実行し、その中のstartNormalGame
メソッドからScene_Title
シーン(タイトル画面)を呼び出す。
Graphics.startGameLoop
(js/rmmz_core.js
)
5.1.4. PIXI.Application
のstart
メソッドを叩いている?🤔
参考
あとがき
オブジェクト指向とのロードイベント(主にイベントリスナーの)とゲームループが入り乱れていて時折迷子になった🙄(今後丁寧な解説を書くことがあったらこの3要素はしっかり押さえたい)
何よりオブジェクト指向の流れを文章にし辛かった。パンくずリストっぽいものを書くなり、途中途中で呼び出しの図みたいなものがあれば幾らか分かり易くなるかもしれない🤔
Discussion