Section 4.7 トランジションに対応する(その2)

前回作った onCopyLayer メソッド でちゃんとトランジションに対応できてるように見えるんだけど、まだ何か足りないの?
onCopyLayer メソッド を使えば、 見た目はトランジションに対応できるんだけど、これだけだとトランジションした後に、ちょっと困ったことが起きちゃうんだ。
困ったことって?
例えば、こういう場合。

<トランジションした後に日付を変更する KAG スクリプト>

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

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

; 表画面に06/30と表示します
[eval exp="date.drawDate(6, 30)"]

; 表画面の内容を裏画面にコピーします
[backlay]

; 裏画面にも適当な背景を読み込みます
[image storage="bg2" layer=base page=back]

; トランジションします
[trans layer=base time=1000 method=crossfade]
[wt]

; 表画面の日付を07/01に変更します
[eval exp="date.drawDate(7, 1)"]

これって、トランジションした後に日付を変えてるの?
そ。これを実行すると…

<実行結果>

実行過程

あれっ? 日付を変えてるはずなのに、表示は06/30のままになってるよ?
これがトランジションした後に起きる、ちょっと困ったことだよ。
う〜ん、確かにこれだと困っちゃうね…
でもどうして日付表示が変わらないの?
日付を表示してる2つのレイヤは foreLay が表画面用のレイヤで、 backLay が裏画面用のレイヤだったよね。
うん、そだね。
実は、1回トランジションすると、foreLay が裏画面のレイヤで、 backLay が表画面のレイヤになっちゃうんだ。
えっ、それってつまり表と裏が入れ替わっちゃうってこと?
ん、そういうこと。
だから、裏画面の方のレイヤの日付表示が07/01になってるの。
でも、image タグとかだと、 トランジションした後に表と裏が入れ替わったりすることなんてないよ?
page=fore にするといつでも表画面に画像が表示されるし。
それはトランジションした後に、KAG のシステムが表画面の情報と裏画面の情報を自動的に交換してくれてるからだよ。
え、そうなの?
うん。でもプラグインが独自に持ってるレイヤまでは管理してもらえないから、 プラグインの方で表と裏を交換するメソッドを作っとかないと、こんなふうに表と裏が逆転しちゃうってワケ。
へぇ、そうなんだ…
で、それをやるのが onExchangeForeBack メソッド っていうイベントハンドラ。
onExchangeForeBack メソッド?
onExchangeForeBack メソッドは layer=base children=true のトランジションが終わった時に呼び出されるんだ。
layer=base children=true のトランジションが終わった時って、確か onCopyLayer メソッドも呼び出されるんだったよね?
ん、その後に onExchangeForeBack メソッドが呼び出されるの。
ふぅん、そうなんだ。
それで、具体的にはどうやったら表画面と裏画面の情報って交換できるの?
今回のプラグインの場合はカンタンだよ。

<表画面と裏画面の情報を入れ替える onExchangeForeBack メソッド>

function onExchangeForeBack()
{
    foreLay <-> backLay;  // 表画面用レイヤと裏画面用レイヤの参照を入れ替えます
}

これで OK。
えっ、これだけでいいの?
うん。表画面の情報は foreLay、つまり表画面用のレイヤだけだし、 裏画面の情報は backLay、つまり裏画面用のレイヤだけだから、この2つを交換するだけ。
あ、そういえば <-> って今までに見たことないんだけど、これって演算子?
そだよ。
<-> 演算子は左側の変数の値と右側の変数の値を入れ替える演算子なんだ。
ってことは、foreLay の中身と backLay の中身を入れ替えてるってこと?
ん、そういうこと。
えっと、何で foreLay の中身と backLay の中身を入れ替える必要があるのかよくわかんないんだけど…
トランジションすると、今まで表画面だったレイヤが裏画面のレイヤになって、 今まで裏画面だったレイヤが表画面のレイヤになるんだ。
こんなふうに。

<トランジション前後のレイヤ構造>

トランジション前後のレイヤ構造

あ、トランジションした後に foreLay に日付を書き込んでも、 裏画面に書き込むことになっちゃうんだ。
そう。
だから、onExchangeForeBack メソッドが呼び出された時に、 foreLaybackLay を入れ替えると…

<レイヤの参照入れ替え>

レイヤの参照入れ替え

今度はちゃんと foreLay が表画面のレイヤを指してて、 backLay が裏画面を指すようになってるでしょ。
ほんとだ。これなら foreLay に日付を書き込めば表画面に表示されるね。
んじゃ、前回DatePlugin クラスに onExchangeForeBack メソッド を追加して、 さっきのスクリプトをもっかい実行してみよっか。
必要なファイルはここに置いとくね。
うん。

<実行結果>

実行過程

あっ、今度はちゃんとトランジションの後に日付が07/01に変わったね。
これでトランジションに対応できたね。
えっと、結局プラグインを作る時には、onCopyLayer メソッドと onExchangeForeBack メソッドを両方作らなくちゃいけないってことなんだよね?
レイヤを使って画像を表示するプラグインを作る時は基本的にそうなるね。
でも、画像を表示しないプラグインを作る時は、この2つのメソッドは作らなくてもいいよ。
あ、そっか。画像を使わないんならトランジションは関係ないもんね。
じゃ、トランジションの話はとりあえずこれでおしまい。
次回はマクロを使ってプラグインのメソッドを呼び出せるようにするね。
それじゃ、また次回!


前へ | TOP | 次へ