Section 4.11 設定の保存

今回はプラグインの設定をセーブできるようにしてみるね。
プラグインの設定って?
日付が何月何日になってるかってことと、レイヤの位置と表示/非表示の情報だよ。
あ、そういうことね。
えっと、それってやっぱり KAG のセーブデータの中に書き込んだりするの?
そうだよ。
onStore っていうメソッドを使って、 プラグインの設定をセーブデータに書き込むの。
じゃあ、データをセーブする時に onStore メソッドが呼び出されるってこと?
ううん、そうじゃないよ。
えっ? じゃあ onStore メソッドっていつ呼び出されるの?
KAG ってどこでもセーブできるわけじゃないってことは知ってるよね?
うん。セーブできるのってセーブ可能なラベルの所だけだよね。
onStore メソッドが呼び出されるのは、そのセーブ可能なラベルを通過した時なんだ。
あ、そうなんだ。
だから、セーブデータに書き込まれるのは、直前にセーブ可能なラベルを通った時の設定内容になるってワケ。
つまり、プラグインのデータも普通のセーブデータと同じで、 セーブできるのはセーブ可能なラベルを通った時のデータだけ、ってことなんだね。
そういうこと。
ただ、tempsave タグでセーブした時は、tempsave タグを実行した時の状態がセーブされるんだけどね。
それじゃ、まずは onStore メソッドでプラグインの設定をセーブデータに書き込んでみるね。

onStore メソッド>

function onStore(f, elm)
{
    // セーブデータの中に dateOptions という辞書配列を作ってプラグインの設定を書き込みます
    f.dateOptions = new Dictionary();
    with(f.dateOptions)
    {
        // 設定内容を書き込みます
        .foreVisible = foreVisible;  // 表画面のレイヤが表示されているか
        .backVisible = backVisible;  // 裏画面のレイヤが表示されているか
        .foreLeft = foreLay.left;    // 表画面のレイヤの左端位置
        .backLeft = backLay.left;    // 裏画面のレイヤの左端位置
        .foreTop = foreLay.top;      // 表画面のレイヤの上端位置
        .backTop = backLay.top;      // 裏画面のレイヤの上端位置
        .foreMonth = foreMonth;      // 表画面のレイヤの日付(月)
        .backMonth = backMonth;      // 裏画面のレイヤの日付(月)
        .foreDay = foreDay;          // 表画面のレイヤの日付(日)
        .backDay = backDay;          // 裏画面のレイヤの日付(日)
    }
}

onStore メソッドの第1引数の f は辞書配列になってて、 この辞書配列にデータを書き込むと、書き込んだ内容がセーブデータに記録されるんだ。
で、今回は f の中に dateOptions っていう辞書配列を作って、 これにプラグインの設定を書き込んでるの。
じゃあ、onStore メソッドの第1引数の f って、 ゲーム変数の f ってこと?
ん〜、厳密に言うと onStore メソッドの第1引数の f とゲーム変数の f は別の辞書配列なんだけど、どっちも同じセーブデータに書き込まれるよ。
ふぅん、そうなんだ。
じゃあ、第2引数の elm っていうのは?
第2引数は tempsave の時のオプションってことになってるんだけど、 必ず void になるから、この引数は使わないよ。
え、そうなの?
うん。だから onStore メソッドの引数は1個って思っててもいいんじゃないかな。
そっか。わかった。
じゃ、onStore メソッドを使って、実際にプラグインの設定をセーブしてみよっか。
うん、そうだね。
まず、このスクリプトを実行してみて。
必要なファイルはこれね。

<プラグイン設定のセーブ(first.ks)>

[call storage="DatePlugin.ks"]

; 表画面と裏画面のレイヤそれぞれの設定をします
[dateopt page=fore left=20 top=20 month=1 day=23 visible=true]
[dateopt page=back left=20 top=20 month=3 day=21 visible=true]

; セーブ可能なラベルを通過します(ここで onStore メソッドが呼び出されます)
*label|

; データをセーブします
[save place=0]

『01/23』って表示されたね。
うん。
これでデータがセーブされたはずだから、一旦ウィンドウを閉じて。
はーい。
で、krkr.eXe があるフォルダに savedata っていうフォルダがあって、 その中に data0.kdt っていうセーブファイルがあるから、それをメモ帳とかで開いてみて。

<セーブファイルがある位置>

セーブデータが記録されているファイルの位置

セーブデータってメモ帳とかで読めるの?
Config.tjs のセーブデータの保存モード(saveDataMode)を "z" とか "c" とかにすると、 セーブデータが圧縮されたり暗号化されたりして読めなくなるんだけど、デフォルトの設定なら読めるよ。
へぇ、そうなんだ。
じゃあ、開いてみるね。

<セーブデータ(data0.kdt)の中身>

data0.kdtの中身

うわ、なんかすごい色んなことが書かれてるね。
うん。セーブデータにはレイヤの状態とかスクリプトのどの位置でセーブされたかとか、 いっぱい情報が保存されるからね。
さっき保存したプラグインのデータって、どこに書いてあるの?
dateOptions』で検索してみればすぐに見つかるよ。
なるほど。じゃあ、『dateOptions』で検索、っと。
あ、あった。

<プラグインの設定が書かれている箇所(赤枠で囲まれている部分)>

プラグインの設定が書かれている箇所

ちゃんと設定した通りに値が書き込まれてるでしょ。
うん、レイヤの位置とか日付は設定した通りになってるみたいだね。
けど、foreVisiblebackVisible1 になってるよ?  これって true のはずでしょ?
変数の値をファイルに保存するときは、true1 になって、 false0 になるんだ。
あ、そうなんだ。
それじゃ、truefalse って実は数値なの?
そうだよ。
ただ、偽は 0 だけど、 真は 1 じゃなくて『0 以外』ってことになってるから、そこんとこ注意してね。
それってどういうこと?
例えば、if(x) っていう条件式があって、x が数値だとすると、 この条件が成り立たないのは x の値が 0 の時だけってこと。
じゃあ、x2 とか -1 とかでも成り立つの?
うん。
0 以外ならどんな数値でも真とみなされるからね。
へぇ、そうなんだ。
これでデータがセーブできてるのも確認できたことだし、今回はこんなところかな。
それじゃ、また次回ね!


前へ | TOP | 次へ