スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

HistoryLayer差し替えメモ

KAGEXのHistoryLayerを差し替えるためのメモ。
もっとKAGWindowとずぶずぶだと思ってたけど割と分離してた。
頑張って書き換えより最初から作った方が早いんじゃないか。

必須メンバ変数
外部から参照されていて、ないとエラーになるもの。
*name
レイヤの名前。書き込みのみ。
KAGWindowのコンストラクタで生成直後に書き込まれる。
HistoryLayerのコンストラクタでも書き込んでる。謎。
KAGWindowのほう要らん。

*visible
履歴が表示されているか。読み込みのみ。
何でこっち見てんだ。historyShowingの方見ろや。
これもKAGWindowの方書き換えた方がよさげ。

※kag3ex3でhistoryShowing見るように修正

*parent
履歴レイヤの親レイヤ。書き込みのみ。
履歴表示直前にkag.fore.baseに書き換えられる。
KAGEXのプライマリレイヤの方にしとけば必要なす。

*absolute
履歴レイヤの絶対位置。書き込みのみ。
履歴表示直前とreorderLayersで書き換えられる。
これもいらん気がする。

*storeState
履歴を栞に保存するか。読み込みのみ。
true固定でええがな。

*everypage
ページ単位での履歴表示を行うか。読み込みのみ。
internalRestoreFlagsの中で動作分岐してる。
やるならHistoryLayerの中で分けるべき。
そもそもstoreStateがtrue固定なら要らんっぽい。

必須メンバ関数
外部から呼び出されていて、ないとエラーになるもの。
*コンストラクタ(win, par)
KAGWindowのコンストラクタで生成される。

*store(ch)
渡された文字列chを履歴に記録する。

*reline()
改行を履歴に記録する。

*repage()
改ページを履歴に記録する。

*save()
保存すべきデータを返す。(storeStateがtrueの時のみ)
あとは勝手にKAGWindowが保存してくれる。

*load(dic)
dicにsave()で返したデータが渡される。
それを使って履歴の状態を復帰。(storeStateがtrueの時のみ)

*clear()
履歴の内容をクリア。
[clearhistory]タグで呼ばれる。

*setOptions(elm)
elmには[history]タグの属性が渡される。
履歴のオプションを設定。
output、enabled属性はKAGWindowの方で処理されるので必要なし。

*dispInit()
履歴を表示する。

*dispUninit()
履歴を非表示にする。

*beginIndent()
インデントを設定。
[indent]タグで呼ばれる。

*endIndent()
インデントを解除。
[endindent]タグで呼ばれる。

*setNewAction(action)
履歴アクションを登録。
[hact]タグから呼ばれる。
ワールド拡張の[dispname]タグ、[dispnameVoice]タグからも呼ばれる。

*clearAction()
履歴アクションの登録を終了(クリア)。
[endhact]タグなどから呼ばれる。
ワールド拡張の[afterline][afterpage]タグからも呼ばれる。

*windowMouseWheel(shift, delta, x, y)
履歴表示中にホイールが回転した場合KAGWindowから呼ばれる。

オプションメンバ関数
定義されている場合のみ呼ばれる。
*fontUpdate(hs)
hs : 履歴表示中か
kag.chDefaultAntialiasedかkag.chDefaultFaceが変更されたときに呼ばれる。

*autoReline()
メッセージレイヤにおいて自動改行があった場合に、store()の直前に呼ばれる。

*preIndent()
セリフ部分の自動インデントがあるときに呼ばれる。

*storeName()
ワールド拡張で名前が描画されたときにstore()の代わりに呼ばれる。

↓デフォルトのKAGEXで差し替えてもエラーが出ないヒストリーレイヤもどき
/*
 *  HistoryLayerの最少構成的な何か
 *  ・履歴の内容はtargetLayerに表示
 *  ・最大で9行分までてきとーに表示。
 *  ・最後に描画された行は履歴には描画されない。
 *  ・インデント/履歴アクション非対応
 *  ・ホイール回転で履歴を隠す。
 */

class MyHistoryLayer {
    property parent {
        setter(par) {
            targetLayer.parent = par;
        }
    }
    property visible {
        getter() {
            return targetLayer.visible;
        }
    }
    property absolute {
        setter(abs) {
            targetLayer.abs = abs;
        }
    }
    property name {
        setter(name) {
            targetLayer.name = name;
        }
    }
    property storeState {
        getter() {
            return true// 常にtrue
        }
    }
    property everypage {
        getter() { // 呼ばれることはないはず
            System.inform("everypageが呼ばれました");
            return false// 常にfalse
        }
    }
    
    var targetLayer; // 履歴を表示するレイヤオブジェクト
    var data = []; // 履歴データ(改行ごとに記録、リングバッファ)
    var curLine = 0// 現在の行(履歴データの最後尾)
    var maxLine = 10// 履歴に一度に表示できる行数(履歴データの大きさ)
    
    function MyHistoryLayer(win, par) {
        // コンストラクタ
        with (targetLayer = new Layer(win, par)) {
            // ターゲットレイヤの設定
            .setImageSize(par.width, par.height);
            .setSizeToImageSize();
        }
    }    
    function finalize() {
        // デストラクタ
        invalidate targetLayer if targetLayer !== void;
    }
    
    function store(ch) {
        // 文字列chを履歴に記録。
        data[curLine] += ch;
    }    
    function reline() {
        // 改行を履歴に記録。
        curLine = (curLine+1)%maxLine; // curLineを1つ進める。
        data[curLine] = "";
    }    
    function repage() {
        // 改ページを履歴に記録。
        reline(), reline(); // 改行を2回入れる
    }
    
    function save() {
        // 保存するデータを返す。
        if (!storeState) { return void; } // storeStateは常にtrue。一応
        else {
            var dic = %[];
            (dic.data = []).assignStruct(data);
            dic.curLine = curLine;
            return dic;
        }
    }    
    function load(dic) {
        // 履歴の状態の復帰
        if (!storeState) { return; } // storeStateは常にtrue。一応
        else if (dic !== void) {
            data.assignStruct(dic.data);
            curLine = dic.curLine;
        }
    }
    
    function clear() {
        // 履歴の内容をクリア。
        with (targetLayer) { .fillRect(00, .width, .height, 0x99000000); } // 塗りつぶし
        data.clear();
        curLine = 0;
    }
    
    function dispInit() {
        // 履歴を表示する
        with (targetLayer) {
            // 履歴の内容を描画
            .fillRect(00, .width, .height, 0x99000000); // 塗りつぶし
            var h = 20// 文字描画高さ
            for (var i = curLine+1; i != curLine; i = (i+1)%maxLine) {
                .drawText(20, h, data[i], 0xFFFFFF); // 文字描画
                h += .font.getTextHeight(data[i]) + 2// 次の行の描画高さを計算
            }
            // 履歴表示
            .visible = true;
        }
    }    
    function dispUninit() {
        // 履歴を非表示にする
        targetLayer.visible = false;
    }
    
    function setOptions(elm) {
        // 履歴のオプションを設定
    }
    
    function beginIndent() {
        // インデントを設定
    }
    function endIndent() {
        // インデントを解除
    }
    
    function setNewAction(action) {
        // 履歴アクションを登録
    }    
    function clearAction() {
        // 履歴アクションの登録おわり
    }
    
    function windowMouseWheel(shift, delta, x, y) {
        // 表示中にホイールが回転した
        kag.hideHistory(); // 履歴を非表示にする
    }
}

スポンサーサイト

タグ : 吉里吉里 KAGEX TJS

カテゴリ : KAGEX

コメントの投稿

非公開コメント

No title

fontUpdate
autoReline
preIndent

は、typeof historyLayer.~ で関数の存在チェックをしてから呼んでるので
必須メンバ関数ではありません。どうでもいいですけど。

No title

↑すんません、オプションメンバ関数の説明を見落としてましたorz

No title

コメントありがとうございます。
ちょこっと見やすくしてみました。
最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。