Inside KAG3/履歴レイヤ改造のヒント

Last-modified: 2016-02-23 (火) 12:43:18

ポイント

HistoryLayerクラスを継承

HistoryLayerクラスを継承し改造版履歴レイヤクラス(仮にMyHistoryLayerとする)を実装する。
必要に応じて画像・効果音素材なども用意する。

class MyHistoryLayer extends HistoryLayer {
  // ...
}

KAGWindowクラスを継承

Override.tjsに、KAGWindowクラスを継承した改造版KAGメインウィンドウクラス(仮にMyKAGWindowとする)を記述する。
コンストラクタでメンバ変数historyLayerをMyHistoryLayerオブジェクトに繋ぎ換える。

// Override.tjs
class MyKAGWindow extends KAGWindow
{
  // コンストラクタ
  function MyKAGWindow(ismain = true, width = 0, height = 0)
  {
    super.KAGWindow(ismain, width, height);
    // 本来の履歴レイヤを管理オブジェクトのリストから外し、無効化してしまう
    remove(historyLayer);
    invalidate historyLayer;
    // 改造版履歴レイヤを作成し、管理オブジェクトのリストに登録
    historyLayer = new MyHistoryLayer(this, fore.base);
    add(historyLayer);
  }
  // デストラクタ
  function finalize() {
    super.finalize();
  }
}
global.kag = new MyKAGWindow() if typeof global.kag == "undefined";

※この程度なら、直接KAGWindowクラスを改造しても構わないと思う。

HistoryLayerクラスの仕様に関して

HistoryLayerクラスを継承する上でネックとなる点は以下の通り。
凝ったことをさせるなら直接改造した方が早いかも知れない。

  • 無地(黒)の画像の上にメッセージを描画する前提で記述されている。マウスホイールでスクロールする際、レイヤ画像を上下(または左右)にコピーし、足りないメッセージを補充するような実装になっている
    • 例えば、任意の画像を表示させるには、MyHistoryLayerオブジェクトを透明にし、奥に画像表示用レイヤ(KAGLayerオブジェクト)を敷くか、関連するメソッドを全てオーバーライドする
    • Config.tjsのeverypageをtrue固定にして構わないなら、HistoryLayer.clearBack()メソッド内でloadImages()を呼び出し、任意の画像を表示させる方法が簡単である
  • メンバ変数controlHeightは「次ページ」「前ページ」「×」ボタンの高さ(ピクセル)を意味しているが、画面上部に配置する前提で使われている
    • スクロール用コントロールを画面の上下左右に配置させるには、この値を0にし、marginL, marginR, marginT, marginB(上下左右のマージン)で辻褄合わせする方が手っ取り早い