Section 4.10 メッセージレイヤとの連動

今回は、日付表示をメッセージレイヤと連動できるようにしてみるね。
それってどういうこと?
メッセージレイヤって、右クリックすると消えるでしょ。
うん、消えるね。
右クリックでメッセージレイヤを非表示にする時に日付も一緒に非表示にして、 もう一回右クリックしてメッセージレイヤを表示する時に日付も一緒に表示しようってこと。
プラグインってそういうこともできるんだ?
うん。今作ってる日付表示プラグインみたいに、画面にシステム関係の画像を表示する場合は、 メッセージウィンドウを非表示にする時に、一緒に画面から画像を消したいってこともあるからね。
なるほどね。
で、そのために使うのが onMessageHiddenStateChanged メソッド
それって、メッセージレイヤが非表示になった時と表示された時に呼び出されるイベントハンドラ?
基本的にはそうなんだけど、onMessageHiddenStateChanged メソッドは、 ユーザの操作によってメッセージレイヤが非表示になったり表示されたりした時にだけ呼び出されるんだ。
ユーザの操作によって、って?
ユーザがメッセージレイヤを操作した時、例えば右クリックしたりとか、 メニューの「メッセージを消す」を選択したりとか、そういう時に呼び出されるってこと。
じゃあ position タグで visible 属性を設定した時は呼び出されないの?
うん。そういうのはシナリオファイルに書いてあるから、 ユーザが意図的にメッセージレイヤを操作してるわけじゃないでしょ。
あ、そっか。
ただ、hidemessage タグを実行した場合は呼び出されるけどね。
あ、そうなんだ。
それって hidemessage タグはメニューの「メッセージを消す」を選択するのと同じ動作をするタグだから?
うん、そういうこと。
じゃ、実際に onMessageHiddenStateChanged メソッドを作ってみるね。
は〜い!

onMessageHiddenStateChanged メソッド>

function onMessageHiddenStateChanged(hidden)
{
    if(hidden)
    {
        // メッセージレイヤが非表示になったので foreLay, backLay も非表示にします
        foreLay.visible = false;
        backLay.visible = false;
    }
    else
    {
        // メッセージレイヤが表示されたので foreLay, backLay の visible を
        // メッセージレイヤが非表示になる前の状態に戻します
        foreLay.visible = foreVisible;
        backLay.visible = backVisible;
    }
}

まず、onMessageHiddenStateChanged メソッドには引数が1つあるんだ。
hidden っていうのだよね?
そ。この hidden っていう引数は、 メッセージレイヤが非表示になった時には true になってて、 表示された時には false になってるんだ。
ってことは、メッセージレイヤが非表示になった時は if の方のブロックの中身が実行されるから、 foreLaybackLay も非表示になるんだよね?
ん、そう。
メッセージレイヤが表示された時は else の方のブロックの中身が実行されるんだよね?
そうだよ。
じゃあ foreLaybackLayvisibletrue にすればいいんじゃないの?
なんでわざわざメンバ変数を使ってるの?
もしかしたらメッセージレイヤが非表示になる前に、 foreLaybackLay が非表示だったかもしれないでしょ。
あ、そっか。
foreLaybackLayvisibletrue にしちゃうと、元々非表示だった場合でも表示されちゃうんだ。
そうならないようにするために、メッセージレイヤが非表示になる前の foreLaybackLayvisible の値を foreVisiblebackVisible に予めセットしといて…
メッセージレイヤが表示された時に、メッセージレイヤが非表示になる前の状態に戻すんだね。
そうそう。
このために setOptions メソッドで foreVisiblebackVisible の値を設定してたんだね。
ん、そういうこと。
それじゃ、これでスクリプトはできたから、日付表示とメッセージレイヤの表示が連動するかどうか、実行して試してみよっか。
うん。
実行する前に、Config.tjs のメッセージレイヤの initialMessageLayerVisibletrue にしといてね。

<初期状態でメッセージレイヤを表示します(Config.tjs より抜粋)>

// ◆ 初期状態でメッセージレイヤを表示するかどうか
// true を指定するとメッセージレイヤ0が初期状態で表示状態になりますが、
// false を指定すると初期状態ではすべてのメッセージレイヤは初期状態で非表示
// になります。
;initialMessageLayerVisible = true;

うん、直したよ。
あと、first.ks はこんな感じね。

<first.ks の中身>

; プラグインを作るスクリプトを読み込みます
[call storage="DatePlugin.ks"]

; 表画面に適当な背景を読み込みます
[image storage="bg1" layer=base page=fore]

; 表画面に06/30と表示します
[dateopt page=fore left=20 top=20 month=6 day=30 visible=true]

それじゃ、実行してみて。
スクリプトはここに置いとくから。
はーい!

<起動直後のウィンドウ>

起動直後のウィンドウ

最初はメッセージウィンドウと日付が両方表示されてるね。
ん。じゃ右クリックしてみて。
おっけー。

<右クリック後のウィンドウ>

右クリック後のウィンドウ

あっ、メッセージウィンドウと日付がどっちとも消えた!
ん、OK だね。
それじゃ、もう一回右クリックしてみて。
うん。

<もう一回右クリックした後のウィンドウ>

もう一回右クリックした後のウィンドウ

ちゃんと日付も表示されてるね。
ん。あと、日付を非表示にしてる時もうまくいくかチェックしてみよ。
first.ks をこう書き換えて実行してみて。

<日付を非表示にした first.ks>

; プラグインを作るスクリプトを読み込みます
[call storage="DatePlugin.ks"]

; 表画面に適当な背景を読み込みます
[image storage="bg1" layer=base page=fore]

; 表画面の日付を06/30に設定しますが表示はしません
[dateopt page=fore left=20 top=20 month=6 day=30]

dateopt マクロの visible の指定を消すんだね。
ん。日付表示のレイヤはデフォルトで非表示にしてるからね。
じゃあ、実行してみるね。

<起動直後のウィンドウ>

起動直後のウィンドウ

今度はメッセージウィンドウだけが表示されたね。
ん。じゃ右クリックね。

<右クリック後のウィンドウ>

右クリック後のウィンドウ

1回右クリックするとメッセージウィンドウが消えて、もう1回右クリックすると…

<もう一回右クリックした後のウィンドウ>

もう一回右クリックした後のウィンドウ

ちゃんと元の状態に戻ったね。
ん、これで OK だね。
今回の内容はだいたい解った?
うん。onMessageHiddenStateChanged メソッドの作り方はそんなに難しくなさそうだし。
じゃ、今回はこんな感じかな。
次回からはプラグインのデータを保存したり読み込んだりしてみるね。
それじゃ、また次回ね!


前へ | TOP | 次へ