- []
- [以前のリビジョン]
KAGシステムの初期化
KAGシステムとは
Kirikiri Adventure Game Systemといい、アドベンチャーゲーム(ノベルゲーム)のシステムとして吉里吉里に同梱されているスクリプト群です。タグと呼ばれる記号を記述していくことで、プログラミングに不慣れな人でも比較的簡単にノベルゲームを開発できるので、同人ソフトをはじめ一部のゲーム会社でも吉里吉里/KAGは採用されています。
タグを記述していくので、テキストベースの開発となり簡単になったとはいえ敷居は若干高めといえます。ただ、KAGシステムはTJSで書かれたシステムであり吉里吉里上で動かすことには違いないので、TJSスクリプトを直接実行させることもでき、ミニゲームなどを作品中にいれることもできます。このように、覚えることの多さと記述の手間は多少かかりますが、逆にいうと自由度の高い玄人好みのツールといえます。
startup.tjs
KAGシステムも吉里吉里上で動くシステムですので、一番最初に実行されるのはプロジェクトフォルダにあるstartup.tjsです。KAGシステムのプロジェクトフォルダはkag/templete/です(ゲームの開発のときはこのテンプレートを複製して個々のプロジェクトフォルダを作成しますが、ここでは位置を示すため元のテンプレートの場所で進めていきます)。
それではstartup.tjsを見ていきましょう。
// kag3/templete/startup.tjs
0005: // このスクリプトは一番最初に実行されるスクリプトです
0006: Scripts.execStorage("system/Initialize.tjs"); // system/Initialize.tjs を実行
systemフォルダの中にあるInitialize.tjsを実行して(execute)います。このスクリプトはいろいろなものを初期化して(initialize)いるものです。主なもののみになりますが、順に説明しています。
クロージャ
11行目でDebug.messageのショートカットを作成しています。Debugクラスは吉里吉里が提供するクラスで、コンソールや監視式を管理しています。このDebug.messageはDebugクラスが保有するメソッドで、「コンソールへメッセージを出力する」という処理が定義されています。メソッドとは処理の流れを定義したもので、他のプログラミング言語の関数、手続き(プロシージャ)、サブルーチンなどと呼ばれるものと似たニュアンスをもつものです。
メソッドは括弧をつけて、Debug.message("メッセージ")のように使います。括弧がなければ、定義されている処理を実行することができないからです。ですが、ここでは括弧をつけていません。括弧がないときは、その定義情報自体を意味します。そしてそれは代入することができます。
つまり、dmには「コンソールへメッセージを出力する」という機能が代入され、dm("メッセージ")とするだけでコンソールへメッセージを送ることができるようになります。このような、メソッドの機能自体(メソッドへの参照)を代入できるという機能をクロージャと呼びます。
// kag3/templete/system/Initialize.tjs
0007: /*
0008: Debug.message へのショートカット
0009: */
0010:
0011: var dm = Debug.message; // これで dm("message"); でコンソールに message を表示できる
パスの設定
48行目から95行目にかけては、パスの設定とパッチの適用について書かれています。これに関してはパスの設定・パッチの適用で詳しく書いていきます。
Configファイルの読み込み
135行目から157行目は設定(config)関係について書かれていますが、これも別ページで詳しくやります。設定ファイルの適用になります。
各システムの読み込み
188行目からKAGシステムを構成するスクリプトを読み込んでいます。これらのスクリプトではいろんなオブジェクトの設計図たるクラスの定義が行われています。
// kag3/templete/system/Initialize.tjs
0183: /*
0184: 各システム読み込み
0185: */
0186: dm("KAG System スクリプトを読み込んでいます...");
0187:
0188: KAGLoadScript("Utils.tjs");
0189: KAGLoadScript("KAGLayer.tjs");
0190: KAGLoadScript("HistoryLayer.tjs");
0191: KAGLoadScript("BGM.tjs");
0192: KAGLoadScript("SE.tjs");
0193: KAGLoadScript("Movie.tjs");
0194: KAGLoadScript("Conductor.tjs");
0195: KAGLoadScript("AnimationLayer.tjs");
0196: KAGLoadScript("GraphicLayer.tjs");
0197: KAGLoadScript("MessageLayer.tjs");
0198: KAGLoadScript("Menus.tjs");
0199: KAGLoadScript("DefaultMover.tjs");
0200: KAGLoadScript("MainWindow.tjs");
kag作成
232行目で、ようやくMainWindowクラスのインスタンスをglobalの位置(一番上位)にkagという名前で作成しています。ただし、kagが未定義のときのみで、(通常は起こらないはずですが)既にkagが作成されているときは作成しません。また、インスタンスが作成される際にはコンストラクタが実行されます。こちらはいろんなことが行われていますが、管理するメニューやレイヤ、BGMなどのインスタンスを作成したり、ウィンドウ自体のサイズや外見を調整したりしています。MainWindow.tjsの261行目からMainWindow.MainWindow(コンストラクタ)が定義されていますので、興味ある人は眺めてもよいかもしれません。
// kag3/templete/system/Initialize.tjs 0226: /* 0227: KAG メインウィンドウの作成 0228: グローバルメンバ kag が存在しなければ KAGWindow クラスの 0229: オブジェクトを作成して入れる 0230: */ 0231: 0232: global.kag = new KAGWindow() if typeof global.kag == "undefined";
first.ksの実行
(実際に表示される)ウィンドウとシステムを兼ねたメインウィンドウが用意できたので、279行目でKAGシナリオで書かれたksファイルを読み込んで実行しています。最初に実行されるKAGシナリオファイルはfirst.ksです。
0275: /*
0276: first.ks の実行
0277: */
0278:
0279: kag.process("first.ks");
最後に
細かいことは置いとおくと、KAGシステムの初期状態はこのようにして作成されます。これから、KAGシナリオを解析し、タグのとおり処理していきます。このページで触れなかったパスの設定・パッチの適用と設定ファイルの適用を書いたあと、KAGシナリオの解析関係について触れていく予定です。

