<?xml version="1.0" encoding="Shift_JIS" ?>
<doc>

<title>トランジションを使おう</title>

<para>
<ptitle>その前に</ptitle>
　フェードインやフェードアウト、ブラインドなど、時間をかけて画面を切り替える効果を<kw>トランジション</kw>(移り変わり)と呼びます。<r/>
　吉里吉里/KAGでは、クロスフェードトランジション、ユニバーサルトランジション、スクロールトランジションの、３つの種類のトランジションを使用することができます。<r/>
　また、拡張トランジションプラグイン ( extrans.dll ) を用いると、いくつかのトランジションをさらに使うことができるようになります ( 吉里吉里 SDK ヘルプの「トランジションについて」を参照してください )。<r/>
</para>

<para>
<ptitle>クロスフェードトランジション</ptitle>
　クロスフェードトランジションは、単純な画面切り替え効果です。<r/>
　トランジション(移り変わり)ですから、トランジション前の画像と、トランジション後の画像が必要になります。KAG の場合、トランジション前の画像は表ページのレイヤで、トランジション後の画像は裏ページのレイヤになります。つまり、裏ページのレイヤの画像が表ページにくるわけです。<r/>
　トランジションの開始とともに、時間をかけて表ページの画像が裏ページの画像に置き換わり、最終的に裏ページの画像が表ページの画像になります。<r/>
<r/>
<note>
　KAG には<kw>フェードアウト</kw>、<kw>フェードイン</kw>という概念がありません。黒にフェードアウトさせたい場合は裏ページを真っ黒な状態にしてからクロスフェードトランジションをかけます。
</note>
</para>

<para>
<ptitle>ユニバーサルトランジション</ptitle>
　ユニバーサルトランジションというのは、ユニバーサル(汎用的な) トランジション(移り変わり)のことで、いわゆる「画面切り替え効果」を自由に作成することができるモノです。<r/>
<r/>
　また、ユニバーサルトランジションには、<kw>ルール画像</kw>と呼ばれる、グレースケールの画像が必要になります。ルール画像のサイズがトランジションを行いたいレイヤよりも小さい場合は、自動的にタイル状に敷き詰められて使用されます。この画像を「ルール」として、トランジションを進行させます。<r/>
　そして、ユニバーサルトランジションに必要な属性、<kw>time</kw> (トランジションを行っている時間)と、<kw>vague</kw> (<kw>あいまい領域値</kw>) が必要になります。<r/>
<r/>
　例を示します。<r/>
<r/>
　以下の画像を見てください。<r/>
<descimg>
<dititle>トランジション前、トランジション後、ルール画像</dititle>
<img src="univtrans_A.png"/><img src="univtrans_B.png"/><img src="univtrans_R.png"/>
</descimg>
<r/>
　このように、A と書いてある画像が、B と書いてある画像に移り変わるとします。また、ルール画像には、単純ですが 上から下へ、黒から白へのグラデーションの画像を使うとします。<r/>
<r/>
　さて、まず <kw>vague</kw> (あいまい領域値) を 1 にすると、以下のようにトランジションが進行します。左から右へと進行しています。便宜上、移り変わりを横に並べて示していますが、実際はこれが連続して同じ場所で表示されるのです。<r/>
<descimg>
<dititle>vague=1 のとき</dititle>
<img src="univtrans_V1.png"/>
</descimg>
<r/>
　つまり、ルール画像の黒いところから、白いところに向かって、だんだんと B の画像に置き換わっていっているのです。<r/>
<r/>
　ここで vague=64 としてみましょう。<r/>
<descimg>
<dititle>vague=64 のとき</dititle>
<img src="univtrans_V64.png"/>
</descimg>
　こんどは、A の画像と B の画像の境界がぼやけていますね？ このように、vague の値を大きくすると、移り変わりの中で、A でも B でもない、あいまいな部分を大きくすることができます。vague には 1 以上の数値を指定できます。<r/>
<r/>
　ルール画像には、このように単純なグラデーションだけではなく、いろいろな模様を指定することによって、それに従って自由にトランジションを行わせることができます。<r/>
<r/>
　吉里吉里ダウンロードページ<at target="_top"  href="http://kikyou.info/tvp/">http://kikyou.info/tvp/</at> には、「<kw>トランジションライブラリ</kw>」として、ユニバーサルトランジションのルール画像が 20 種類以上入ったものが公開されています。<!-- また、ユニバーサルトランジショントランジションがどういうものかを実際に目で見ることができるスクリプトも同梱されていますので、ユニバーサルトランジションに関する理解を深めてください。--><r/>
</para>

<para>
<ptitle>スクロールトランジション</ptitle>
　スクロールトランジションは、ユニバーサルトランジションとは違い、切り替え元 ( 裏画面 ) の画像が切り替え先 ( 表画面 ) の画像の領域内にスクロールして入ってくる感じの物です。<r/>
　切り替え元 ( 裏画面 ) の画像が入ってくる方向は、左、上、右、下の4方向から選べます。<r/>
　また、スクロールの仕方で3つの種類があります。<r/>
<r/>
　まず、<kw>stay</kw> 属性に "stayfore" を指定した場合のスクロールトランジションは、以下のようになります(下から入ってくる場合)。<r/>
<descimg>
<dititle>stay=stayfore のとき</dititle>
<img src="univtrans_Sstay.png"/>
</descimg>
　このように、stay 属性に "stayfore" を指定すると、表ページの画像がその場にとどまったまま、裏ページが外から移動して入ってくる感じになります。<r/>
<r/>
　また、stay 属性に "stayback" を指定した場合のスクロールトランジションは以下のようになります。<r/>
<descimg>
<dititle>stay=stayback のとき</dititle>
<img src="univtrans_Sstaysrc.png"/>
</descimg>
　この場合は、表ページのレイヤが移動して出ていく後ろから、裏ページのレイヤが見えてくる感じになります。<r/>
<r/>
　stay 属性に "nostay" を指定すると以下のようになります。<r/>
<descimg>
<dititle>stay=nostay</dititle>
<img src="univtrans_Snostay.png"/>
</descimg>
　このように、入ってきた切り替え元の画像に押されるようにしてスクロール元の画像が出ていきます。A の画像と B の画像を横または縦に連続した物にすれば、大きな画面をスクロールさせているような効果を出すことができます。でも前景レイヤの切り替え効果にはあんまり向いていません<tt>(^^;;</tt><r/>
</para>

<para>
<ptitle>表ページと裏ページ</ptitle>
　トランジションを行ううえで非常に重要なのが<kw>表ページ</kw>と<kw>裏ページ</kw>という概念です。<r/>
　<link href="DispBase"/> でも紹介しましたが、KAG は、普段目に見える表ページと、目には見えない裏ページがあって、両方は見えるか見えないかだけが違うほかは、まったく同じ構成をしています。<r/>
　KAG のトランジションは常に、いま表示されている表ページの内容にかわって、裏ページの内容がだんだんと表示されてくるという方向で行われます。トランジションが終わると、表ページの内容は完全に裏ページの内容と同じになります。<r/>
　というわけで、トランジション前には裏ページを操作しなければなりません。<r/>
<r/>
　例を示します。背景レイヤのみを入れ替える場合を考えます。<r/>
　まず、トランジション前、レイヤの状態が次のようであったとします ( 左が表、右が裏 )<r/>
<r/>
<descimg>
<dititle>トランジション前</dititle>
<img src="trans0f.jpg"/>
<img src="trans0b.jpg"/>
</descimg>
　この時点で表ページは背景レイヤに全景レイヤ、メッセージレイヤが表示されています。裏ページはどのような状態でもかまわないものとします。<r/>
　ここで [backlay] タグで裏ページを表ページと同じにします。<r/>
<descimg>
<dititle>backlay タグ実行後</dititle>
<img src="trans0f.jpg"/>
<img src="trans0f.jpg"/>
</descimg>
　トランジションは裏ページの内容を表ページに移すものですので、トランジションを行う前に、裏ページをいじらないといけません。<r/>
　ここでは背景レイヤのみを入れ替えたいので、裏ページの背景レイヤに画像を読み込みます。<r/>
<descimg>
<dititle>裏ページの背景レイヤに画像を読み込んだ後</dititle>
<img src="trans0f.jpg"/>
<img src="trans2b.jpg"/>
</descimg>
　ここでやっと trans タグでトランジションを行えます。くどいようですが、トランジションは裏ページの画像を表ページに持ってきます。<r/>
　トランジション中は以下のようになります ( トランジションの例 )。<r/>
<descimg>
<dititle>トランジション中</dititle>
<img src="trans3f.jpg"/>
<img src="trans2b.jpg"/>
</descimg>
　トランジションは [wt] タグで待ちます。<r/>
　トランジションが終われば、以下のように、裏ページと表ページが同じになります。<r/>
<descimg>
<dititle>トランジション後</dititle>
<img src="trans2b.jpg"/>
<img src="trans2b.jpg"/>
</descimg>
</para>

<para>
<ptitle>背景レイヤを切り替えてみよう</ptitle>
　トランジションを行うには <kw>trans</kw> タグを使います。<r/>
　基本的にトランジションは、裏ページに [<kw>backlay</kw>] タグにてすべての表ページのレイヤ情報を裏ページにコピーして、裏ページで変化させたい部分を image タグなどでいじり、そして trans タグでトランジションを実行します。すると、裏ページに適用した変化が、現在の表ページと入れ替わるように、表ページに適用されます。<r/>
<r/>
　まずは、背景レイヤをクロスフェードトランジションで切り替えてみましょう。<r/>
<r/>
<bq>
[image storage="bg0" page=fore layer=base]<r/>
[wait time=200]<r/>
*start|スタート<r/>
[cm]<r/>
こんにちは。背景レイヤを切り替えます。[l][r]<r/>
<b>[backlay]</b><r/>
[image storage="bg1" layer=base <b>page=back</b>]<r/>
<b>[trans method=crossfade time=1500]</b><r/>
<b>[wt]</b><r/>
切り替わりましたか？<r/>
</bq>
　まず、[backlay] タグで表ページのレイヤの情報を裏ページにコピーしています。<r/>
　そして、裏ページの背景レイヤに、次に表示すべき画像を読み込んでいます。<r/>
　この時点で、裏ページが表ページと違うのは背景画像だけです。<r/>
　次に trans タグでトランジションを実行しています。このように、trans の属性で <tt>method=crossfade</tt> と指定するとユニバーサルトランジションとなります。この例では時間は 1.5 秒と指定しています。時間はミリ秒単位で指定するので <tt>time=1500</tt> と指定します。<r/>
<note>
　ミリ秒単位で指定をしますが、精度がミリ秒単位ほどあるというわけではありません。
</note>
<r/>
　その後、<kw>wt</kw> タグでトランジションの終了を待っています。<b>KAG は wt タグを書かないとトランジションを待たずに次にいってしまいます</b>ので、wt タグを忘れないようにしてください。<r/>
<note>
　トランジションに限らず、KAG の「時間をかけて何かを処理するもの」のほとんどのタグはそれ自体では終了を待たずに、終了を待つためのタグが別にあります。これにより、トランジションしながらBGM のフェードアウト、というようなことができます。<r/>
　また、<b>対応する「待つ」タグは必ず書いてください</b>。異種類の物でまとうとする場合 ( トランジションの終了を wait タグで待つなど ) でも、正しく対応する「待つ」タグは一応書いておく必要があります。<r/>
</note>
<r/>
<r/>
　また、ユニバーサルトランジションを使ってみると以下のようになります。<r/>
<bq>
[image storage="bg0" page=fore layer=base]<r/>
[wait time=200]<r/>
*start|スタート<r/>
[cm]<r/>
こんにちは。背景レイヤを切り替えます。[l][r]<r/>
<b>[backlay]</b><r/>
[image storage="bg1" layer=base <b>page=back</b>]<r/>
<b>[trans method=universal rule="rule1" vague=1 time=1500]</b><r/>
<b>[wt]</b><r/>
切り替わりましたか？<r/>
</bq>
<r/>
　この例でも trans タグでトランジションを実行しています。このように、trans の属性で <tt>method=universal</tt> と指定するとユニバーサルトランジションとなります ( method タグを省略しても universal であると見なされます )。この例では、ルール画像として "rule1" 、時間は 1.5 秒、あいまい領域値は 1 という設定です。<r/>
<r/>
　また、これをスクロールトランジション、右から、居座りなしでトランジションを行うとすると・・・<r/>
<r/>
<bq>
[image storage="bg0" page=fore layer=base]<r/>
[wait time=200]<r/>
*start|スタート<r/>
[cm]<r/>
こんにちは。背景レイヤを切り替えます。[l][r]<r/>
[backlay]<r/>
[image storage="bg1" layer=base <b>page=back</b>]<r/>
[trans <b>method=scroll from=right stay=nostay children=false</b> time=1500]<r/>
[wt]<r/>
切り替わりましたか？<r/>
</bq>
　となります。ここでは <tt>children=false</tt> と指定しているのは、このように指定しないと「<kw>子レイヤ</kw>」も一緒に移動してしまうからです。KAG では、背景レイヤが親、前景レイヤとメッセージレイヤは背景レイヤの子にあたります。<r/>
　子レイヤも一緒にスクロールしていいのであれば <tt>children=true</tt> にしてもかまいません。<r/>
</para>

<para>
<ptitle>前景レイヤを切り替えてみよう</ptitle>
　前景レイヤを切り替えるにも trans タグを使います。<r/>
<r/>
<bq>
[image storage="bg0" page=fore layer=base]<r/>
[wait time=200]<r/>
*start|スタート<r/>
[cm]<r/>
こんにちは。前景レイヤをトランジションを使って表示させます。[l][r]<r/>
[backlay]<r/>
[image layer=0 page=back storage="fg0" visible=true]<r/>
; この時点で、表ページの前景レイヤ 0 は(デフォルトのままなので)不可視、<r/>
; この時点で、裏ページの前景レイヤ 0 は可視で画像を保持していて、<r/>
; 他の裏ページのレイヤは backlay タグの効果で、すべて表ページと同じ<r/>
[trans method=crossfade time=1500][wt]<r/>
つぎは、前景レイヤを入れ替えます。[l][r]<r/>
[backlay]<r/>
[image layer=0 page=back storage="fg1" visible=true]<r/>
; この時点で、裏ページの前景レイヤ 0 は fg1 という画像、<r/>
; 他の裏ページのレイヤは backlay タグの効果で、すべて表ページと同じ<r/>
[trans method=crossfade time=1500][wt]<r/>
そうしたら、前景レイヤを消します。[l][r]<r/>
[backlay]<r/>
[layopt layer=0 page=back visible=false]<r/>
; この時点で、裏ページの前景レイヤ 0 は不可視、<r/>
; 他の裏ページのレイヤは backlay タグの効果で、すべて表ページと同じ<r/>
[trans method=crossfade time=1500][wt]<r/>
</bq>
　上の例は、前景レイヤを表示させ、それを別の画像に入れ替え、そして消しています。<r/>
　まず、表示させる所ですが、まず、backlay タグを使って、表ページの情報をすべて裏ページにコピーしています。そのあと、変更したい部分、ここでは前景レイヤに前景を表示させたいわけですから、裏ページの前景レイヤに画像を読み込んでいます。<r/>
　そのあと、trans タグを使用しています。<r/>
<r/>
　つぎに前景レイヤを入れ替えていますが、これも、backlay で裏ページにコピーした後、変更したい部分を操作し、trans タグでトランジションを行わせています。<r/>
<r/>
　最後に前景レイヤを消していますが、backlay で裏ページにコピーした後、該当する前景レイヤを非表示にしています。非表示になっているということは、つまり表示されてないということで(あたりまえか) 、トランジションを行わせると消えます。<r/>
<r/>
　なお、このなかで、裏ページにあるレイヤに対して visible=true としているので、表示されてしまうのか、と心配かもしれませんが、裏ページ ( 背景レイヤとその子レイヤ ) はもともと非表示にしかならないので、visible=true と指定しても表示される心配はありません。<r/>
<r/>
<note>
　上記の例のように、trans タグの layer 属性を省略すると base ( 背景レイヤ ) が指定されたとみなされ、children 属性を省略すると true が指定された ( 子レイヤも含めて一緒にトランジション ) をするという意味になります。<r/>
　前景レイヤをトランジションを使って表示したいとき、入れ替えたいとき、消したいときなどや、その他の諸々のトランジションは、背景レイヤに対して、子レイヤも含めて一緒にトランジションさせるというのがミソです。layer=0 などとして前景レイヤやメッセージレイヤに対して個別にトランジションをかけることもできますが、通常は使いません。<r/>
</note>
</para>

<para>
<ptitle>メッセージレイヤを切り替えてみよう</ptitle>
　メッセージレイヤも同様の方法で切り替えることが出来ます。<r/>
　メッセージレイヤの場合、表示・非表示は layopt タグで操作できるので同様の動作を行うことができます。<r/>
<r/>
　たとえば、メッセージレイヤを非表示のまま描画し、描画し終わってからトランジションで画面に表示するには以下のようにします。また、そのあと、メッセージレイヤをトランジションを使って非表示にしています。<r/>
<r/>
<bq>
[layopt layer=message page=fore visible=false]<r/>
; ↑最初は表ページメッセージレイヤを非表示に<r/>
[layopt layer=message page=back visible=true]<r/>
; ↑裏ページのメッセージレイヤを表示状態に<r/>
[wait time=200]<r/>
*start|スタート<r/>
[cm]<r/>
[current page=back]<r/>
; ↑操作対象のメッセージレイヤを裏ページに<r/>
[delay speed=nowait]<r/>
; ↑文字描画速度をノーウェイトに<r/>
このようにトランジションを使いながらメッセージレイヤを表示させることができます。[r]<r/>
[delay speed=user]<r/>
; ↑文字描画速度を元に戻す<r/>
[trans method=universal rule="trans1" vague=1 time=1500][wt]<r/>
; ↑ユニバーサルトランジション<r/>
[current page=fore]<r/>
; ↑念のために操作対象のメッセージレイヤを表ページの物に<r/>
[l]<r/>
; ↑クリック待ち<r/>
[layopt layer=message page=back visible=false]<r/>
; ↑裏ページのメッセージレイヤを非表示に<r/>
[trans method=universal rule="trans1" vague=1 time=1500][wt]<r/>
; ↑トランジション<r/>
</bq>
</para>
</doc>
