「んねーねー」
「何だ?」
「シナリオのスクリプトはだいたいできたんだけど、すきゃんてぃ、あれをやってみたいんだなー」
「あれじゃわからん」
「ほらほらー、映画とかドラマとかの最後になんと、俳優さんの名前とか、脚本家やカメラマンの名前とかがでてくんやつ」
「キャストロールやスタッフロールのことか?」
「なんだかよくわかんないけど、下から上に名前がどばどばどばーって流れていくやつだもん」
「ふーん、で、それをゲームのエンディングに入れたい、と」
「そーだもん。最初わ、名前を書いて、消して、書いて、消して、みたいなことをやってたんだけど、やっぱしあんましかっこよくないんだなーこれが。んでもって、すきゃんてぃぜーったいに字が下から上に流れていくやつをやりたいんだもん!」
「KAGならできるよ」
「やっぱねー! KAGならできんと思ったんだよねー!」
「キャストロールを作るための専用機能はないから、次のような考え方をして作成することになる」
「んで、次のよーな考え方って?」
1. | [layopt] タグで message1 レイヤーを可視状態にする |
2. | [position] タグで message1 レイヤーの初期状態を設定する |
3. | [current] タグで操作対象レイヤーを message1 にし、文字を書く |
4. | [move] タグで message1 レイヤーを移動させる |
5. | [layopt] タグで message1 レイヤーを不可視状態に戻す |
6. | [position] タグで message1 レイヤーの初期状態をデフォルトに戻す |
7. | [current] タグで操作対象レイヤーを message0 に戻す |
「今まで普通にシナリオを表示させる時には文字レイヤー message0 を使っていたが、このように一時だけ特殊効果を行う場合は、message1 を使った方がいい。最初に [position] タグで message1 の指定をすることから始める」
「んきゃー! すきゃんてぃわ [position] わきらいだもんねー!」
「そんなこと言ってる場合じゃない。KAG使いになるには複数のレイヤーを効果的に活用することができなくちゃな」
「わかったもん。んでもなー」
「んでも、何だ?」
「今まですきゃんてぃわ、文字レイヤーを2こ使ったことがないんだなー」
「それじゃ、順番に説明していこう」
「それがいーもん」
「それじゃまずは、[layopt] を使って message1 が見えるようにしよう」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\ |
「あんでいちいちそんな真似をすんのかなー?」
「これは非常に大切なことだが、KAGに実装されている二枚の文字レイヤー0と1のうち、レイヤー0は常に表示状態だが、普段使わない1の方はデフォルトでは不可視状態になっているんだ」
「なるほどねー」
「簡単なノベルゲームを作るなら文字レイヤーは2つもいらないだろうけど、文字レイヤー1を使う場合は必ず可視状態にしてやる必要があるってわけだ」
「そこまでわ、わかったもん」
「そうしたら次は [position] タグを使って、スタッフロールに使う文字レイヤー message1 の基本位置を決めよう。[position] タグは、以前、ゲームのメニュー画面を作る時に height 属性をちょっとだけ使ったけど、ここではこのタグが持つほとんど全ての属性をフル活用する」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\
[position layer=message1 color=0xFF0000 opacity=128 left=160 top=0 width=640 height=3340 marginL=0 marginT=0 marginR=0 marginB=0]\
|
「なんかわかりにくそーだなー」
「[position] タグの属性については W.Dee 氏のタグリファレンスに詳しく書いてあるが、一応ここでも簡単に説明しておこう」
[position] タグの属性について |
全般、色など |
layer |
以下の属性を適用する対象レイヤーを指定する |
color |
レイヤーの色を指定する (0xRRGGBB) |
opacity |
レイヤーの透明度を指定する (0〜256) |
位置指定に使う属性 |
left |
レイヤーの左位置を指定する |
top |
レイヤーの上位置を指定する |
width |
レイヤーの幅を指定する |
height |
レイヤーの高さを指定する |
テキストのマージン指定に使う属性 |
marginl |
左マージンを指定する |
margint |
上マージンを指定する |
marginr |
右マージンを指定する |
marginb |
下マージンを指定する |
「ややこしそうに見えるけど、実はそうでもない。位置指定の四属性と、マージン指定の四属性をひっくるめて覚えれば、あとはいつも目にする属性ばかりだ」
「んでもすきゃんてぃ、おぱしちー( opacity )ってゆー属性は初めてだよ」
「あ、そうだね。あれは透明度を指定する属性なんだ。0にすると見えなくなり、256にすると透明でなくなる。128でちょうど半透明だ」
「あれれー? どっかでやったっけかなー?」
「その通りだ。 Config.tjs をいじった時に frameOpacity という設定がちょっとだけ出てきた。opacity っていうのは透明度を設定する属性なんだ」
「なるほどねー。んで、実行すんとどーなんのかなー?」
「こんなふうになる」

「通常のスタッフロールは画面の中央に左合わせの状態で表示されるから、こんな形にした方がいいだろう」
「ふーん。んでも、赤くなってんのわ、どーしてかなー?」
「位置合わせのために便宜上色をつけているだけだ。全てのテロップがきちんと流れることを確認したら透明に戻せばいい」
「つまり、仮置きってことだねー」
「そういうこと」
「んでもって、次わ?」
「ここで、新しいタグを一つ覚えておこう。[current] というタグだ」
「なんなのかなー? それ」
「操作対象の文字レイヤーを指定するタグだ。文字レイヤーを二枚扱う場合、どっちのレイヤーに文字を書くかを指定しないといけない」
「そーだねー、文字レイヤーは2こあんもんね」
「文字を書く前に [current] で操作対象レイヤーを message1 に切り替える」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\
[position layer=message1 color=0xFF0000 opacity=128 left=160 top=0 width=640 height=3340 marginL=0 marginT=0 marginR=0 marginB=0]\
[current layer=message1]\ |
「これで message1 に文字が書けるようになった。それじゃ、スタッフロールに使われる文字を書いてみよう。一度に表示した方がいいから、[delay speed=nowait] を使おう。もちろん [delay speed=user] に戻すことを忘れないように」
「んーと……」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\
[position layer=message1 color=0xFF0000 opacity=128 left=160 top=0 width=640 height=3340 marginL=0 marginT=0 marginR=0 marginB=0]\
[current layer=message1]\
[delay speed=nowait]\
STAFF
脚本 和泉 風
脚本 新藤 秋人
(中略)
協力 W.Dee(吉里吉里/KAG)
感謝 これをやってくれたひと
[delay speed=user]\
|
「こんなかんぢでいー?」
「うん、そんな感じだが、もう一息だ。それだといきなり表示されちゃうぞ。こんなふうに」

「これぢゃーかっこわるいなー」
「最初は画面の下に隠れていて見えない方がいいよね。というわけで、ここでは文字レイヤー message1 の初期位置をいじってもいいけど、非常にアナログな手段として、一画面分の空行を文字の先頭行より前に入れてやろう。そうすれば文字が画面の外に配置されることになる」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\
[position layer=message1 color=0xFF0000 opacity=128 left=160 top=0 width=640 height=3340 marginL=0 marginT=0 marginR=0 marginB=0]\
[current layer=message1]\
[delay speed=nowait]\
STAFF
脚本 和泉 風
脚本 新藤 秋人
(中略)
協力 W.Dee(吉里吉里/KAG)
感謝 これをやってくれたひと
[delay speed=user]\
|
「なるほどねー」
「それじゃ、ここまでできたらいよいよ [move] タグを使って文字レイヤー1を動かそう。[move] タグの属性にはいろいろあるけど、ここで使うのは次のものだ」
layer | 動かすレイヤーを指定。 |
path | X座標、Y座標、レイヤー濃度を指定。 |
time | 動かす時間を指定。 |
「んー、path ってゆーのがよくわかんない」
「 path っていうのは、レイヤーが移動する位置を指定する属性だ。レイヤーの左上の座標を指定する」
「あんましよくわかんない」
「レイヤーのサイズは config.tjs で設定しているだろ? あとは、その左上の点がどこに移動するかを [move] で指定してやればいいんだ」
「よくわかんない」
「こんなふうに書いてみよう」
*staffroll
[ct]\
[layopt layer=message1 page=fore visible=true]\
[position layer=message1 color=0xFF0000 opacity=128 left=160 top=0 width=640 height=3340 marginL=0 marginT=0 marginR=0 marginB=0]\
[current layer=message1]\
[delay speed=nowait]\
STAFF
脚本 和泉 風
脚本 新藤 秋人
(中略)
協力 W.Dee(吉里吉里/KAG)
感謝 これをやってくれたひと
[delay speed=user]\
[move layer=message1 time=10000 path=(160,-2000,-1)]\
[wm]\
|
「ほらーほらー、やっぱしすきゃんてぃわ、path のとこがよくわかんないぢゃんよもー!」
「 path で指定している三つの整数には次のような意味がある」
「はやくおしえなさいよねもー!」
「わかったわかった。最初の 160 は、動かす message1 が移動を終えた時の左端の座標を表している。スクリプトの前のほうで [position] で指定した left の値と同じだ。これが同じということは、message1 は横には移動しないことになる」
「つぎわー!?」
「次の -2000 という数字は、 message1 が [move] で移動を終えた時の上端の座標を表している。つまり、下の図の左上にある (0,-2000) まで動くということだ。こうすることにより、message1 に書いた全ての文字が画面の上に消えていくことになる」

「あんで画面の外に画面があんのよもー!」
「仮想画面ってやつだ。デフォルトの吉里吉里/KAGでは表示しないが、画面の外にも作業のための領域があると思ってくれ」
「ほんとにこんなんでいーのかなー?」
「まあ、実行してみようか」

(最初は何も見えなくて……)
↓

(あ、下から字が上がってきた)
↓

(ちゃんと全部表示されて……)
↓

↓
(画面の上に消えていった!)
「うわーうわーほんとだー! えーがの最後みたいに字が下から上にどばどばどばーって流れていったもんねー! すごいぢゃんよもー!」
「あとは、細かい調整をするだけだ。速度が速すぎたり遅すぎたりすると感じたら time の値を変えてみればいいし、文字が消えてから随分と待たされるようだったら path の二番目の数字である -2000 を適当な値に変更すればいい」
「すきゃんてぃちょーかんどーしたもんねー! やっぱしKAGってすごいんだねー!」
「ふっふっふ。もっと褒めてくれ。まるで我が身を褒められているような気がするぜ」
「すきゃんてぃだいまんぞくだもん!」
「でも、この方法は素人のおいらが考えた一つの例に過ぎないし、他にいい例はたくさんあると思うよ。開発者の W.Dee 氏もこんなふうにおっしゃっている」
「どんなふーにおっしゃってんのかなー?」
もしこれを省メモリで行うとすると、
やっぱりTJSの知識が必要になってしまいますが、
これはこれでかまわないでしょう。(^^;
動いていますから。
たかが 640*8000 ですから 20MB の画像ですし。(笑)
|
「この 640*8000 というのは、1999ChristmasEve で使われたエンディングのスタッフロールで [move] タグが生成した画像サイズなんだ」
「んでも、『だぶるでー』さんがいーってゆってくれてんだから、いーぢゃんよもー」
「うん。今のおいらの知識ではこういうやり方しか思いつかないけど、皆さんはKAGを使い倒していく上で、皆さんなりの表現方法を工夫してもらいたいと思うよ」
「そーだねー!」
練習日記 6日目 まとめへ
|