6.16 セーブ/ロード画面のまとめ

今回はシステムボタンをクリックするとセーブ画面とかロード画面が表示されるようにするんだよね?
ん、あとコンフィグ画面もね。
あ、そーいえば前にシステムボタン作った時にはコンフィグ画面を表示するボタンってなかったよね?
うん、だから今回新しく作るの。
あ、そーなんだ。
ってワケで、まずは5章で作ったシステムボタンプラグイン(ExSystemButtonPlugin クラス)をちょっと書き換えるね。
ExSystemButtonPlugin クラスについては §5.10 参照。
ボタンを増やすの?
ん、だからまず createButtons メソッドを書き換えなくちゃいけないよね。

createButtons メソッド>

function createButtons(parent, array)
{
    var obj;

    // ボタン 0 (セーブ画面表示)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onSaveButtonClick));
    obj.loadImages('button_save'); // セーブボタン用画像を読み込みます

    // ボタン 1 (ロード画面表示)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onLoadButtonClick));
    obj.loadImages('button_load'); // ロードボタン用画像を読み込みます

    // ボタン 2 (コンフィグ画面表示)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onConfigButtonClick));
    obj.loadImages('button_config'); // コンフィグボタン用画像を読み込みます

    // ボタン 3 (メッセージスキップ)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onSkipButtonClick));
    obj.loadImages('button_skip'); // メッセージスキップボタン用画像を読み込みます

    // ボタン 4 (オートモード)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onAutoModeButtonClick));
    obj.loadImages('button_auto'); // オートモードボタン用画像を読み込みます

    // ボタン 5 (メッセージ履歴表示)
    array.add(obj = new ExSystemButtonLayer(kag, parent, onShowHistoryButtonClick));
    obj.loadImages('button_history'); // メッセージ履歴表示ボタン用画像を読み込みます
}

前に作ったシステムボタンプラグインの createButtons メソッドとどこが違うかわかる?
ロードボタンとメッセージスキップボタンの間にコンフィグボタンが追加されてるね。
あとメッセージウィンドウを消すボタンがなくなってるみたいだね。
今回は右クリックでメッセージウィンドウを消せるようにするから、 メッセージウィンドウを消すボタンは削除したんだ。
あ、そうなんだ。
確かにそれならメッセージウィンドウを消すボタンは必要ないね。
あと、コンフィグボタンについてだけど、まずボタンの画像はコレね。

<コンフィグボタン用画像(button_config.png)>

これも他のボタンとおんなじで、左から通常時・押されてる時・マウスカーソルが乗ってる時・使えない時に表示される画像になってるんだよね?
※他のボタンについては §5.10 参照。
ん、そうだよ。
じゃあ次はボタンが押された時に呼び出される onConfigButtonClick メソッドを作ってくね。
どうやってボタンが押された時にコンフィグ画面を表示するの?
こうやるの。

onConfigButtonClick メソッド>

function onConfigButtonClick()
{
    // 右クリックサブルーチンの設定をします
    kag.setRightClickOptions(%["call" => true"jump" => false"storage" => "config.ks""target" => "*initialize""enabled" => true]);
    // 右クリックします
    kag.onRightClickMenuItemClick();
}

最初に kag.setRightClickOptions っていうメソッドを呼び出して、 それから kag.onRightClickMenuItemClick っていうメソッドを呼び出してるみたいだけど、 これって何やってるの?
じゃまず setRightClickOptions メソッドから説明するね。
うん。
でもその前に、このメソッドの引数になってる辞書配列の要素に見覚えない?
え?
えっと、最初の要素が call で、それから jumpstoragetargetenabled
あっ、これってもしかして rclick タグの要素になってるんじゃない?
そのとーり。setRightClickOptions メソッドを呼び出すのは rclick タグを実行するのとおんなじなんだ。
だから、ここ[rclick call=true jump=false storage="config.ks" target="*initialize" enabled=true] を実行してることになるわけ。
なるほどね〜。
その次onRightClickMenuItemClick メソッドは §5.10 でもちょっと説明したんだけど、覚えてる?
え、そーだったっけ?
う〜ん、名前からすると右クリックとかメニューの関係っぽいけど、どんなメソッドだったかな…?
このメソッドを実行すると、名前の通り右クリックしたのとおんなじ動作をするの。
あ、そうなんだ。
じゃあメニューとは関係ないの?
ん〜ん、メニューとも関係してるよ。
メニューの「メッセージを消す」を選択すると、このメソッドが呼び出されるの。
メッセージウィンドウを非表示にするのが右クリックのデフォルトの動作でしょ。
なるほど、確かにそーだね。
つまり、コンフィグボタンを押すと、まず onConfigButtonClick メソッドが呼び出されるわけね。
で、このメソッドの中で setRightClickOptions メソッドが呼び出されて、 右クリックサブルーチンが設定されるの。
それから onRightClickMenuItemClick メソッドが呼び出されると、 右クリックするのとおんなじになるから、"config.ks""*initialize" っていうサブルーチンが呼び出されるんだね。
ん、そーいうこと。
あ、でも前にコンフィグ画面を作った時に *initialize っていうラベルなんてあったかな…?
なかったよ。
…だよねぇ?
あの時は右クリックしたら直接コンフィグ画面を表示してたから、 ファイル名は "rclick.ks" にしてたし、 ラベル名は *rclick にしてたんだ。
じゃあ今回はファイルとラベルの名前を変えるの?
うん。あとスクリプトもちょっと変えるよ。
あ、そうなの?
ま、ちょっとだけだけどね。
まず、初期化のスクリプトはこんな感じ。

<コンフィグ画面の初期化スクリプト(config.ks 内に記述)>

*initialize
; 右クリックでコンフィグ画面を閉じられるように右クリックの設定を変更します
[rclick jump=true storage="config.ks" target=*back enabled=true]

; 以下略(これ以降は §6.6 で作ったコンフィグ画面の初期化スクリプトと同じです)

えっと、これってラベルの名前が *rclick から *initialize に変わって、 rclick タグの storage 属性が "rclick.ks" から "config.ks" に変わっただけってこと?
ん、そういうこと。
あとコンフィグ画面を閉じる時に実行するスクリプトはこれね。

<コンフィグ画面を閉じるスクリプト(config.ks 内に記述)>

*back
; コンフィグ画面表示前の状態を復元します(但し BGM は復元しません(現在の BGM の再生を継続します))
[tempload place=0 bgm=false]
; メッセージ履歴の出力・表示を有効にします
[history output=true enabled=true]
; メッセージ表示速度の設定を反映します
[delay speed=user cond="kag.chUserMode"]
; 右クリックをデフォルトの動作(メッセージウィンドウ消去)に戻します
[rclick call=false jump=false]
[iscript]
// システムボタンを使っていて、コンフィグ画面を表示する前にメッセージレイヤが表示されていた時は onMessageHiddenStateChanged を呼び出します
if(typeof global.exsystembutton_object != "undefined" && kag.fore.messages[0].visible)
    exsystembutton_object.onMessageHiddenStateChanged(false);
[endscript]
[return]

ん〜っと…
変わったのって rclick タグだけ、なのかな?
そだよ。
storage 属性も target 属性も指定されてないけど、 この後右クリックしたらどーなるの?
call 属性と jump 属性を false にして rclick タグを実行すると、 右クリックがデフォルトの動作に設定されるんだ。
デフォルトの動作って…メッセージウィンドウを消すってこと?
そう。
右クリックサブルーチンが呼び出されるのはボタンを押した時だけにしたいから、 セーブ/ロード/コンフィグ画面を閉じた後は、右クリックをデフォルトの動作に戻してるの。
えっと、じゃあつまり、ボタンをクリックするとセーブとかの画面が表示されて、 普通に右クリックするとメッセージウィンドウが消える、ってこと?
そういうこと。
あと、コンフィグ画面用の領域アクション定義ファイル(config_bg.ma)の storage も書き換えとかないとね。
あ、そっか。これも "rclick.ks" になってるから "config.ks" に書き直さなくちゃいけないんだね。

<領域アクション定義ファイル(config_bg.ma)の中身>

; autodisable を false にすることで、クリッカブルマップをクリックしても、
; クリッカブルマップが無効にならないようにします(何回でもクリックできるようにします)
0: autodisable = false;
;「Back」をクリックした時は config.ks の *back にジャンプします
1: storage = "config.ks"; target = "*back";
; ウィンドウモードの「ウィンドウ」をクリックした時は config.ks の *window にジャンプします
2: storage = "config.ks"; target = "*window";
; ウィンドウモードの「フルスクリーン」をクリックした時は config.ks の *fullscreen にジャンプします
3: storage = "config.ks"; target = "*fullscreen";
;「ページ末まで一度に表示」をクリックした時は config.ks の *pagebreak にジャンプします
4: storage = "config.ks"; target = "*pagebreak";
;「メッセージ表示速度」のゲージをクリックした時は config.ks の *msgspeed にジャンプします
5: storage = "config.ks"; target = "*msgspeed";
;「オートモード速度」のゲージをクリックした時は config.ks の *autospeed にジャンプします
6: storage = "config.ks"; target = "*autospeed";
; フォント名が表示されている部分をクリックした時は config.ks の *font にジャンプします
7: storage = "config.ks"; target = "*font";
; フォントの「アンチエイリアス」をクリックした時は config.ks の *antialias にジャンプします
8: storage = "config.ks"; target = "*antialias";
; BGM 音量のゲージをクリックした時は config.ks の *bgmvolume にジャンプします
9: storage = "config.ks"; target = "*bgmvolume";
; SE 音量のゲージをクリックした時は config.ks の *sevolume にジャンプします
10: storage = "config.ks"; target = "*sevolume";

これでコンフィグ画面関係は OK だから、次は onConfigButtonClick メソッドと同じようにして onSaveButtonClick メソッドと onLoadButtonClick メソッドも書き換えてみて。
最初に setRightClickOptions メソッドを呼び出して、 それから onRightClickMenuItemClick メソッドを呼び出せばいいの?
ん、そうだよ。
わかった。じゃあやってみるね。

onSaveButtonClick メソッド>

function onSaveButtonClick()
{
    // 右クリックサブルーチンの設定をします
    kag.setRightClickOptions(%["call" => true"jump" => false"storage" => "save.ks""target" => "*initialize""enabled" => true]);
    // 右クリックします
    kag.onRightClickMenuItemClick();
}

onSaveButtonClick メソッドはこんな感じで…

onLoadButtonClick メソッド>

function onLoadButtonClick()
{
    // 右クリックサブルーチンの設定をします
    kag.setRightClickOptions(%["call" => true"jump" => false"storage" => "load.ks""target" => "*initialize""enabled" => true]);
    // 右クリックします
    kag.onRightClickMenuItemClick();
}

onLoadButtonClick メソッドはこうかな。
ん、OK。
じゃついでにセーブ画面を閉じるスクリプトも書き換えといて。
rclick タグを書き換えればいいんだよね?
うん。

<セーブ画面を閉じる時に実行するスクリプト>

*close
; セーブ画面表示前の状態を復元します(但し BGM は復元しません)
[tempload place=0 bgm=false]
; メッセージ履歴の出力・表示を有効にします
[history output=true enabled=true]
; スナップショットをアンロックします
[unlocksnapshot]
; 右クリックをデフォルトの動作(メッセージウィンドウ消去)に戻します
[rclick call=false jump=false]
[iscript]
// システムボタンを使っていて、コンフィグ画面を表示する前にメッセージレイヤが表示されていた時は onMessageHiddenStateChanged を呼び出します
if(typeof global.exsystembutton_object != "undefined" && kag.fore.messages[0].visible)
    exsystembutton_object.onMessageHiddenStateChanged(false);
[endscript]
[return]

これでいいかな?
ん、これも OK。
じゃこれで完成だから、ちょっと実行してみよっか。
は〜い!
必要なファイルはここに置いとくから実行してみて。
あと、Config.tjs は前にシステムボタンを作った時と同じように設定しといてね。
ただし、今回はセーブ/ロード画面を使うから、フリーセーブモードは false にしといてね。
※上記のスクリプトは 640×480 ピクセルの画面用です。 800×600 ピクセルの画面用のスクリプトもこちらからダウンロードできます(画面サイズの違いにより、スクリプトの内容が一部 640×480 ピクセルの画面用のものと異なっていますので、800×600 ピクセルの画面用のスクリプトをお使いの方は、本章でのスクリプトの説明内容を適宜読み替えてください)。

<フリーセーブモードの設定(Config.tjs より抜粋)>

// ◆ フリーセーブ
// 栞の保存形式を指定します。
// false を指定すると、メニューバーの「栞をたどる」「栞をはさむ」の
// サブメニュー項目からセーブデータを保存したり読み込んだりします。
// この場合は保存可能な栞の最大の個数は numBookMarks によって制限
// されます。
// true を指定するとフリーセーブモードになり、「栞をたどる」では
// 「開く」ダイアログボックス、「栞をはさむ」では「名前を付けて保存」ダイア
// ログボックスが開き、栞を個別のファイルとして保存するモードになります。
// この場合は 保存可能な栞の個数に制限はありません。また、
// エクスプローラなどによる栞の管理が容易になります。
;freeSaveDataMode = false;

うん、設定できたよ。
んじゃ実行してみて。
りょ〜かい!

<実行結果>

表示されたウィンドウ

ちゃんとコンフィグボタンも表示されてるね〜。
じゃセーブ・ロード・コンフィグ画面がちゃんと表示されるかやってみて。
それじゃ最初はセーブ画面から試してみるね。

<セーブ画面>

SAVEボタンを押した時に表示されたセーブ画面

うん、セーブ画面がちゃんと表示されたし、セーブもできたよ。
じゃ次はロード画面だね。

<ロード画面>

LOADボタンを押した時に表示されたロード画面

うん、ロード画面もおっけーだね。
んじゃ最後はコンフィグ画面。

<コンフィグ画面>

CONFIGボタンを押した時に表示されたコンフィグ画面

これもおっけーだよ。
ん、うまくいったね!
うんっ!
それじゃ、第6章はこれでおしまい。
次は何やるの?
選択肢を作るつもりだよ。
え、選択肢って link タグを使えば簡単に作れるよね?
まぁね。
だからもうちょっと凝った選択肢を作るつもりだよ。
凝った選択肢って?
link タグだとメッセージウィンドウの中に普通のメッセージと同じように選択肢の項目を表示するでしょ?
うん、そうだね。
次の章で作る選択肢は、専用のレイヤを使って選択肢の項目ごとに背景画像が設定できるようにするの。
だから見た目はシステムボタンに近くなるし、あとメッセージウィンドウの外にも表示できるよ。
へぇ、そうなんだ。
それと、制限時間付きの選択肢も作る予定だよ。
あ、それって時間内に選択肢を選ばないと時間切れになっちゃうやつだよね。
そうそう。
ちなみに、次回からまたプラグインを作るから。
じゃあ選択肢ってプラグインを使って作るの?
ん、そうだよ。
ってワケで、次の章もがんばってついてきてね!


前へ | TOP | 次へ