このページの解説では、以下のファイルを使用します。あらかじめダウンロードし、CatSystem2 の scene フォルダ内にしておいてください。
スクリプトを実行するには、CatSystem2 の「シーンリスト」ダイアログウインドウを使用します。ダイアログ下部にある「シーンスクリプトをコンパイル」ボタンを押してコンパイルし、シーンリストからスクリプトと同名のシーンをダブルクリックすることで実行できますので、以下の解説と照らし合わせながら動作を確認して下さい。
マクロファイル | ¯o.txt |
Download
|
|
スクリプトファイル | 0213_03.txt |
Download
|
|
※ダウンロードは、Downloadボタンを右クリックして、リンク先のファイルを保存して下さい。
※マクロファイルは、すでにあるファイルにそのまま上書きしてコピーしてください。
お待たせいたしました。実践スクリプト、ようやく新しいシーンへと突入です。
では早速、スクリプトの中身を見ていきましょう!
……と、あれ? 早速マニュアルに載ってないコマンドが出現しましたよ、先生。
place a2 52
上の行がその該当箇所ですが、確かにマニュアルには載っていません。
えーと、これはどういうことなのでしょうか?
さっくりと種明かしをしてしまいますと、これは「はぴねす!」用に拡張されていた追加命令なのです。具体的には下の画像のように、画面の左上に日時や場所の情報を数秒間だけ表示する命令になっています。
さて、ではこのような拡張命令を作る方法についてですが、残念ながら現段階ではその手段自体が公開されていません。その手段とは、マニュアルで少しだけ触れられている、「kcsスクリプト」という、シーンスクリプトでも画面スクリプトでもない、もっと複雑なスクリプトを利用することなのですが、その仕様自体が公開されていないために、ここでは説明することができないのです。
kcsスクリプトは、いずれ公開されることになるかもしれませんが、現在ではまだその準備ができていませんし、解説するためにはシーンスクリプトのマニュアルよりももっと複雑なマニュアルを用意しなければいけません。それに、実はシーンスクリプトのシステム自体が kcsスクリプトによって作られているため、その部分を触れてしまうとシーンスクリプトの仕様自体を変えられたり、下手に触ってしまうとシステムの動作がおかしくなってしまう危険性もあります。ですので現状では詳細は公開しませんが、そういった機能もあるのだと言うことだけ知っていていただければと思います。
話がいきなり脱線してしまいました。では、気を取り直してシーンスクリプトの解説のほうに参りましょう!
以前の実践スクリプト 0213_02a では、「プレーン」という機能は一切使わなくても十分なスクリプトが組める、と説明しました。実際その通りなのですが、プレーンというものがどういうものなのかを知っていると、スクリプトの幅が一気に広がります。ここではプレーンを「活用」しないまでも、「とりあえず使う」ことだけをしてみましょう。
準 「や~ん、もう! 雄真ったらぁ、チ・コ・ク・よっ①」 //SE ビキッ。青筋が立つ音 fg 1 blend 0 fg 1 fgb33L 500 300 0 2 fg 2 blend 0 fg 2 fga21L 600 220 0 2 fg 3 blend 0 fg 3 fgb33L 710 400 0 2 wait cg 1 bj01,2,1,3,3,1,2 draw wait 雄真 「っ!!」¥@ se 0 se126 fg 1 fade 10 0 255 wait 5 fg 2 fade 10 0 255 wait 5 fg 3 fade 10 0 255 ¥n
まずは上のスクリプトを見てください。上のスクリプトの赤い文字の部分が、プレーンを「指定」している箇所です。
fg命令は、以前の 0213_02b で解説した、cg命令と基本的に同じものですね。一応マニュアルで確認してみてください。ここでは、fg の 0番と 1番と 2番にそれぞれ画像を読み込んでいます。以前と使い方が違うところは、後ろのパラメータで「描画対象プレーン」を指定していることだけです。
実際にこのシーンを実行してみると、上の画像のように表示されるはずです。
すでにこの時点でプレーンが使用されているのですが、見た目には何もわかりませんね。ですが、CS2にはプレーンがどのように使用されているのか確認する方法があります。まずは何も考えず、キーボード上の「P」ボタンを押してください。
「P」ボタンを押すと、左上の画像のような画面になったはずです。これがプレーンの使用状態を表示するための機能です。
右上の画像を見てください。赤い領域がプレーン0、青い領域がプレーン1、黄色い領域がプレーン2、となっており、それぞれが縮小されて1画面内に並べられて表示されていることになります。
先ほど、fg命令で読み込んだ3つの画像が、プレーン2の領域に表示されている3つの青筋(色は赤っぽいですが)ですが、実際のゲーム画面とは違って、この状態ではキャラクターの上に重なって表示されていません。逆に、それ以外の画像はプレーン0の領域に(背景とキャラクターが)重ねられて表示されています。要するに、描画先プレーンを指定しなかった画像はデフォルトプレーン(この場合はプレーン0)に描画され、描画先プレーンを指定した画像は指定したプレーン(今回はプレーン2)に描画されると、基本的にはただそれだけです。
そして、実際のゲームでの表示は、これらのプレーンがシステムによって自動的にリアルタイムに重ね合わされて、下のように表示されるというわけです。(もう一度「P」ボタンを押すと戻ります)
もちろん、これだけでは何の意味もないので、実際にプレーンを「活用」する場合は、この状態でそれぞれのプレーンの表示方法を変えて(拡大縮小したり回転させたり特殊な合成をしたりして)色々な演出を行うわけですが、その前段階の基本は、描画するプレーンを分けることにあります。
今回はプレーンを「活用」せず、とりあえず使ってみただけですので、何の意味もありませんが、ここまでは今後のために覚えておいてください。では、ついでなので本当に意味のなかったことを確認してみましょう。先ほどのスクリプトを、プレーン指定を行わないように、以下のように修正してみてください。
準 「や~ん、もう! 雄真ったらぁ、チ・コ・ク・よっ①」 //SE ビキッ。青筋が立つ音 fg 1 blend 0 fg 1 fgb33L 500 300 fg 2 blend 0 fg 2 fga21L 600 220 fg 3 blend 0 fg 3 fgb33L 710 400 wait cg 1 bj01,2,1,3,3,1,2 draw wait 雄真 「っ!!」¥@ se 0 se126 fg 1 fade 10 0 255 wait 5 fg 2 fade 10 0 255 wait 5 fg 3 fade 10 0 255 ¥n
修正が入ったのは、青で表示された行だけです。後ろのパラメータが削除されていますね。
では、これをコンパイルしてもう一度スクリプトを実行してみましょう。
実行結果は全く一緒ですね。本当にプレーンを使う意味は(今回は)なかったわけです。
一応、先ほどと同じように「P」ボタンを押して、プレーンの使用状態を確認してみましょう。
どうでしょうか、先ほどとは違って全ての画像がプレーン0の領域に表示されていますね。これは全てがデフォルトプレーンに描画されているので、プレーンを使わなかったという意味合いで捉えて問題ないかと思います。(厳密には、どんな状況でもプレーンを使っていないのではなく、無意識にデフォルトプレーンを利用しているということですが)
今回は、本当にプレーンを活用しませんでしたが、是非皆さんはマニュアルを見ながらプレーンの表示を色々と試してみてくださいね。
それでは、下のスクリプトを見てください。
準 「や~ん、もう! 雄真ったらぁ、チ・コ・ク・よっ①」 //SE ビキッ。青筋が立つ音 fg 1 blend 0 fg 1 fgb33L 300 200 0 2 fg 2 blend 0 fg 2 fga21L 400 120 0 2 fg 3 blend 0 fg 3 fgb33L 510 300 0 2 wait cg 1 bj01,2,1,3,3,1,2 draw wait 雄真 「っ!!」¥@ se 0 se126 fg 1 fade 10 0 255 wait 5 fg 2 fade 10 0 255 wait 5 fg 3 fade 10 0 255 ¥n
さっきのスクリプトと全く一緒ですね。今度は blend命令と fade命令について解説していきたいと思います。
このスクリプトの実行結果は先ほど確認していると思いますが、キャラクターを表示したあとすぐに、ほんのわずかな時間差をおいて、青筋の画像を順番に(高速フェードインさせながら)表示していくといった感じになっています。
まずは順番に、それをどうやって実現しているのかスクリプトを追っていきましょう。
fg 1 blend 0 fg 1 fgb33L 300 200 0 2 fg 2 blend 0 fg 2 fga21L 400 120 0 2 fg 3 blend 0 fg 3 fgb33L 510 300 0 2 wait
最初はこの部分からです。2行目・4行目・6行目で、fg命令を使って画像を読み込んでいますが、それぞれその直前の行に、blend命令が置かれています。
もし、この blend命令がなかった場合はどうなるでしょうか? 結果だけ先に話せば、wait命令を実行した瞬間に、読み込んだ3つの画像が画面に表示されることになります。ですがこの場合、実際にはこのタイミングでは画像は表示されません。(もし確認をしたい場合は、この wait命令の直後に何か文章を置き、キー入力待ちされるようにして確認してみてください)
実は、このとき画像は表示されていないのではなく、しっかりと表示されているのです。ですが、その画像が透明になっているために、結果的には表示されていないのと同じことになっているのです。
えーと、何が何だかよくわかりませんね……。とりあえず、マニュアルで blend命令を確認してみましょう。
上のスクリプトでは、"fg 1 blend 0" などとなっていますね。ここで青い文字で書かれている 0 の部分は、マニュアルによると「ブレンド率」だということがわかります。このブレンド率は、0~255 の範囲で指定しますが、通常(省略した場合)は 255 を表すことになります。これは、画像をそのまま表示することを意味します。
では逆に、先ほどのスクリプトと同様に 0 を指定したらどうなるでしょう。それは、完全な透明で表示される(表示されないのと同じ)ことになります。
ついでに言うと、中間の 128 を指定した場合、それは50%の半透明で表示されることになります。
要するに、この blend命令は、その画像をどれくらい透明(あるいは不透明)に表示するのかを指定する命令なのです。今回のスクリプトの場合、画像を時間差をおいて次々に表示させたいため、あらかじめ画像を読み込み、透明な状態でこの後に表示するための準備をしていたということになります。では、次に進んでみましょう。
cg 1 bj01,2,1,3,3,1,2 draw wait
上の部分は今更解説する必要もありませんね。画像(キャラクターのCG)を読み込んで、画面にフェードインで表示させているだけです。次に進みましょう。
fg 1 fade 10 0 255 wait 5 fg 2 fade 10 0 255 wait 5 fg 3 fade 10 0 255
さて、メッセージの表示やSE(効果音)の行を除けば、あとはこの部分だけです。青筋画像を次々に表示しているのはこの箇所になります。
まずは先ほどのように、マニュアルで fade命令を確認してみましょう。上のスクリプトでは、青い部分が「動作フレーム数」、赤い部分が「開始α値」「終了α値」であることがわかるかと思います。
動作フレーム数は、つまり時間(速度)を表すことになります。時間は60フレームで1秒になりますので、この値が 10 ということは、10/60秒、要するに 1/6秒の時間で処理を実行するということになります。
そして、開始α値と終了α値ですが、α値というのは先ほどの blend命令でいうところの「ブレンド率」、つまり画像の透明度を意味します。それの開始値が 0 ということは、最初は表示されない(完全に透明な)状態を意味し、終了値が 255 ということは、最終的に通常表示される(完全に不透明な)状態になることを意味しています。要するに、見えない状態から完全に見える状態に変化するわけですから、画像をフェードインして表示させる、ということになります。
これで、上のスクリプトの1行目・3行目・5行目が、それぞれの画像をフェードインさせる命令ということになることがわかりましたが、それらの間、2行目と4行目に wait命令が入っています。wait命令は、後ろにパラメータを付けた場合、その値は待ち時間(フレーム数)を意味します。
ここでは、"wait 5" となっていますから、5/60秒、つまり 1/12秒だけ待つことになります。この待っている間にも、その前で実行された fade命令は実行されていますので、結果的に時間差をおいてそれぞれの画像が次々にフェードインして表示されるようになるのです。
ずいぶんと説明が回りくどくなってしまいましたが、これでこの部分のスクリプトの動作が理解できましたでしょうか。スクリプトを活用するためには、今後複数の命令をこのように組み合わせて使うことが求められてきますので、頑張って理解してくださいね。
不慣れな方は「何だ、だったら一文で実行できるような命令を作ればいいじゃん」などと思われるかもしれませんね。けれど、その場合、覚えなければいけない命令がそれだけ増えてしまうことにもなりますし、意外に小回りが効かなくなってしまうデメリットもあります。
単純で読みやすい命令であることは、見やすい(解析しやすい)スクリプトになるのと同時に、組み合わせ次第では無限の演出の可能性を持っていることにもなります。このスクリプトに慣れてくると、その辺りのバランスが良い状態でこれらの命令が構成されていることが実感していただけるかと思います。
とりあえず今のところは、騙されたと思って、頑張ってこのスクリプトに慣れてみてください。では、今回はこの辺で。