設定ファイルの適用

設定ファイルの読み込み

system/Initialize.tjsの135行目からConfig.tjsを読み込んでいます。

// kag3/templete/system/Initialize.tjs
0132: /*
0133:   Config.tjs 読み込み
0134: */
0135: if(Storages.isExistentStorage("Config.tjs"))
0136: {
0137:   KAGLoadScript("Config.tjs");
0138: }
0139: else if(Storages.isExistentStorage("Config.~new"))
0140: {
0141:   System.inform("Config.tjs が見つかりません。\nsystem フォルダにある "
0142:     "Config.~new ファイルを Config.tjs に改名してください。");
0143:   System.exit();
0144: }
0145: else
0146: {
0147:   throw new Exception("Config.tjs が見つかりません。");
0148: }

Config.tjsは「;設定名 = 値;」の形式で書かれています。左のセミコロンも空の文の終了を意味し、そのあとに右側の文が処理されるという、TJSスクリプトの文法にそったファイルです。17行目を見ていただきますと、TJSの文法で値が代入されていることがわかるかと思います。

// kag3/templete/system/Config.~new
0014: // ◆ タイトル
0015: // ウィンドウのキャプション(タイトル)および
0016: // タスクバーに表示されるものです。
0017: ;System.title = "吉里吉里";

また、51行目から362行目までKAGWindowに関する設定が記述されています。先ほどのSystem.titleの設定と違いこれは、KAGWindow_configという関数(メソッド)の定義内で設定が記述されています。

// kag3/templete/system/Config.~new
0049: //-------------------------------------------- ウィンドウや動作の設定 -----
0050: 
0051: function KAGWindow_config()
0052: {
0053: // ◆ 画面サイズ
0054: // scWidth に画面の幅、scHeight に画面の高さをピクセル単位で指定します。
0055: // 標準的に使われている 640x480 や 800x600 のような画面サイズではないサイズ
0056: // に設定すると、フルスクリーンにできない場合があります。
0057: ;scWidth = 640;
0058: ;scHeight = 480;
 
0361: 
0362: }

これをKAGWindowクラスのコンストラクタ内で、this(KAGWindowクラスのインスタンス自身)のコンテキストに変更した後、括弧をつけて実行しています。つまり、そのままならglobal.scWidthに値を代入することになりますが、コンテキストを変更することでkag.scWidthに値を代入しています。、設定した値が適用されます。メニューやメッセージレイヤ、BGMに履歴レイヤでも同様の方法を使っています。

// kag3/templete/system/MainWindow.tjs
0261:   function KAGWindow(ismain = true, width = 0, height = 0)
0262:   {
0263:     // コンストラクタ
0264:     // 引数 : ismain : メインウィンドウとして作成されるのかどうか
0265:     super.Window(); // 親クラスのコンストラクタを呼ぶ
0266: 
0267:     // コンフィギュレーション
0268:     isMain = ismain;
0269:     if(ismain)
0270:     {
0271:       (KAGWindow_config incontextof this)();
0272:       (KAGWindow_config_override incontextof this)()
0273:         if typeof global.KAGWindow_config_override != "undefined";
0274:     }

コンテキスト

KAGシステムの初期化 - クロージャでメソッドの機能(メソッドへの参照)を代入し、好きな場所で実行できるという機能を説明しました。なんとなくわかった気になっていただこうと簡単なサンプルスクリプトをご用意いたしました。ここでは、dog.cryというメソッドをglobal下のcryという変数に代入しています。cryメソッドの中で_cryというメンバ変数を参照しています。すなわちdog._cryを参照します。しかし、function cry(){ Debug.message(_cry); }という機能を有したglobal.cryをcatのコンテキスト下で実行すると……。

class Dog{
  var _cry;
  function Dog(){
    _cry = "わんわん";
  }
  function cry(){
    Debug.message(_cry);
  }
}
class Cat{
  var _cry;
  function Cat(){
    _cry = "にゃーにゃー";
  }
}
var dog = new Dog();
var cat = new Cat();
// 犬の鳴くという行為をとりだす
var cry = dog.cry;
// 実行する
cry();
 // function cry(){ Debug.message(_cry); }という行為をcatのもとで実行
(cry incontextof cat)();

以下のような結果がコンソールに出力されます。

17:08:52 わんわん
17:08:52 にゃーにゃー

Config.tjsの話に戻ると、KAGWindow_configメソッド(関数)はクラスの外で定義されています。すなわち、globalの位置にあり、コンテキストもglobalです。KAGWindow_configに直接括弧をつけないと、メソッドの機能そのものを指しますので、上記のクロージャを利用したサンプルと同様、コンテキストをthis(=kag)に変更することでKAGWindowの各メンバ変数の値を書き換えることができます。

update!!!

再びsystem/Initialize.tjsを見てみます。Config.tjsを読み込んだあとに、UpdateConfig.tjsを読み込みます。

// kag3/templete/system/Initialize.tjs
0150: /*
0151:   Config.tjs バージョンチェック
0152: */
0153: 
0154: if(typeof global.config_version == "undefined" || config_version != kagVersion)
0155: {
0156:   KAGLoadScript("UpdateConfig.tjs");
0157: }

UpdateConfig.tjsは、もしConfig.tjsとConfig.~newの両方ともがあったとき設定ファイルの引き継ぎを行うスクリプトです。Config.~newの方が新しい設定ファイルとみなされます。KAGシステムのテンプレートにはConfig.~newが入っていますが、そのままだと吉里吉里は終了してしまいます。最初からConfig.tjsでないのは、KAGシステムをバージョンアップする際systemフォルダ内のTJSスクリプト群を上書きしますが、設定は上書きされると困るのでConfig.tjsとは別の名前になっています。

UpdateConfig.tjsではConfig.tjsやConfig.~newをTJSスクリプトではなく、「;設定名 = 値;」の形式で書かれているテキストとして処理しています。Config.tjsにある既存の設定を引き継ぎながら、Config.~newの内容でConfig.tjsを上書きしていっています。

 
inside/config.txt · 最終更新: 2008/01/28 10:21 by tohka