TACS for Flash 講座


ここではシナリオソースの書き方の応用編として、すこし手がこんだ使い方を説明します。
では、サンプルゲーム#2「日向探偵事務所日記 プロローグ」を例にとって、説明致しましょう。

今回も、シナリオソースをみながら解説をします。
下記リンクのシナリオソースをテキストエディタで開いて下さい。
http://atelier-c.fiw-web.net/tacs_samplegame/game2/tacs.avg

■5〜7行目
FRAME_POS 1,640,480
pic 1,library/messagewindow03.swf;	//メッセージウインドウ設置
"",1
FRAME_POS 1,640,480命令で、メッセージウインドウをわざと表示範囲外の座標を指定してから、
pic 1,library/messagewindow03.swf命令で、メッセージウインドウを配置し、
"",1命令で、メッセージウインドウ内の文字を白紙にしています。

当HPのライブラリに公開されているmessagewindow03.swfは、
メッセージ表示サンプル
全角で30×21文字表示できます

というメッセージがデフォルトで入っている為、その表示を確実に見せないで済ませる方法として、
「メッセージウインドウを画面外に初期配置し、メッセージを白紙にする」という手段をとっております。


■8〜19行目
FRAME_POS 1,30,370
FRAME_SCALE 1,95,95
FRAME_POS 2,0,-10
PIC 2,data/frame2.png;			//背景設置
PIC -1,library/nextbutton04.swf;	//ポーズボタン設置
PIC 0,library/selectwindow03.swf;	//選択肢ウインドウ設置
FRAME_POS 0,500,115
FRAME_POS 8,5,5
FRAME_SCALE 8,75,75
FRAME_POS 3,5,5
FRAME_POS 6,5,5
FRAME_POS 7,5,5
このゲームの基本レイアウトを設定しています。
今回のゲームでの各レイヤー番号の用途を簡単にまとめると…
レイヤー用途座標(x,y)倍率解説
-1番ポーズボタン配置0,0100%画面一杯に透明のボタンを配置。(ライブラリにあるnextbutton04.swfを使用)
0番選択肢ウインドウ500,115100%画面の右側に配置。
1番メッセージウインドウ30,37095%改行幅が背景画像とマッチするよう、若干縮小している。
2番メインフレーム画像0,-10100%この画像の下に配置した背景や立ち絵画像がみえるように、480x360pixelで中がくりぬいてある画像を配置。
3番エフィクト用100%パンチのエフィクトや、食器のカットイン等のエフィクト関係を配置。
4番立ち絵画像配置100%立ち絵画像配置用1
5番立ち絵画像配置100%立ち絵画像配置用2
6番背景画像配置5,5100%背景画像配置1
7番背景画像配置5,5100%背景画像配置2
8番マスク5,575%背景画像を表示する際、画面効果を付加させる為のマスクデータを配置する。マスクデータが640x480pixelで作ったものを使用している為、背景画像の480x360pixelサイズにあわせようと縮小している。



■21〜32行目
BACKLOG_START
PIC 30,library/logwindow02.swf
FRAME_CHANGE 8,30
FRAME_CHANGE 7,30
FRAME_CHANGE 6,30
FRAME_CHANGE 5,30
FRAME_CHANGE 4,30
FRAME_CHANGE 3,30
FRAME_CHANGE 2,30
FRAME_CHANGE 1,30
FRAME_CHANGE 0,30
FRAME_CHANGE -1,30
BACKLOG_START命令で、ログの記録を開始しています。以後BACKLOG_STOP命令によって停止しないかぎり、ログの記録をしつづけます。
ログデータはTACS for Flash内の変数 _root.backlog に格納されます。(このデータにアクセスすれば、ログの確認ができます)
今回は _root.backlog の表示が出来るフラッシュの一つ logwindow02.swf(ライブラリに公開中) を使用。
ただ配置位置が画面の下の方にある30番レイヤーな為、そのままでは見えない為。FRAME_CHANGE命令を使用して、レイヤーの深度を一番上へと入れ換えております。


■37〜49行目
[MEMORY]
PIC 3,library/inputflag.swf
stop
INPUT_TEXT name

?name=;"名前が未入力です!\n主人公の男性の名前を決定して下さい。";[JUMP]


"主人公の名前は「.name.」となります。この名前で決定してよろしいですか?"
*決定する
	#>オープニング
*入力し直す
	[JUMP]
主人公の名前入力をおこなっています。
まず入力命令の直前に[MEMORY]命令をおこない、いざという時はこの行までもどってきて、再入力できるようにしています。

PIC 3,library/inputflag.swf命令にて、入力ウインドウを表示し。
続くstop命令にて、入力ウインドウの操作終了まで待機しています。
その後INPUT_TEXT name命令で、入力完了したデータを nameフラグに格納しています。

?name=;命令はnameフラグに何も格納されてない場合をチェックしています。注意点は多くのプログラム言語でありがちな ?name=""; という記入ではないという事。(そう表記するとnameフラグに "" ってデータが入っているか調べます)

"主人公の名前は「.name.」となります。この名前で決定してよろしいですか?"この命令の .name.という表記に注目。
メッセージ出力命令内で、フラグ名をピリオドで囲った表記をした場合、その部分のメッセージ出力はフラグに格納されているデータになります。


■100、101行目
PIC 4,data/akiko07.png
PIC 5,data/akiko07.png
同じ立ち絵を二枚重ねて表示させています。
次の立ち絵が4番レイヤーに表示される前に、今の4番レイヤーの画像を5番レイヤーに表示させるのが目的。
理由は…
各レイヤーに画像等を読み込んだ際、画面に表示できるところまで読み込める迄の間は、レイヤーが透明になります。一度読み込みが終了すれば、キャッシュとして記録されるので、以後同じデータを読み込んだ際は、透明になる時間が大幅に短くなりますが、それでも一瞬(0.03秒)は透明になります。
つまり立ち絵画像を同じレイヤー番号に入れ換え表示させようとすると、ポーズ(画像)が変わるたびに、点滅したようになってしまう訳です。
これを防ぐ為には、画像が入れ替わる一瞬、その後ろに入れ替わる後か前の画像が表示され続けていればよいわけです。
キャッシュされた(一度読み込んだ)画像ファイルは、以後一瞬の点滅で入れ替えられるので、このように連続で4番と5番レイヤーに読込んでおります。連続で読み込みはしますが、同時に読み込むわけではないので透明になる一瞬がずれる為、大丈夫なわけです。

このサンプルシナリオではあまり意識されておりませんが、
ゲーム中で初読み込みされるデータはユーザーの環境によって読み込み時間が変動するので、上記のような命令は連続で行うより、できるだけ間をあけて実行したほうが効果的です。


■135、136行目
PIC 6,data/move_up.swf
stop
PIC 6,data/move_up.swf命令で、階段を下から上にスクロールするフラッシュを表示し、
stop命令で、フラッシュの再生終了まで待機しています。
読み込んでいるフラッシュのソース(move_up.fla)をみていただければわかると思いますが、ルート階層に _parent._root.Breakmode = 0; とアクションスクリプトを指定する事で、stop命令を解除しています。


■197〜211行目
*話す
	"誰に話しかけようか?"
	-由紀子
		?a=0;"【由希子】\n「なんでこんな意地悪するのよっ」";[JUMP]

		?d=0;?a=1;"【.name.】\n「ええと、由希子ちゃん?」";pause
		?d=0;?a=1;"【由希子】\n「…なに?」";pause
		?d=0;?a=1;"【.name.】\n「ちょっと質問させてくれるかな」";!b=1;[JUMP]

		?g=0;?d=1;PIC 4,data/yukiko01.png
		?g=0;?d=1;PIC 5,data/yukiko01.png
		?g=0;?d=1;"【由希子】\n「まあ、たしかに.name.おにいちゃんのいう通り、犯人と断定はできないけど…」";pause
		?g=0;?d=1;PIC 4,data/yukiko04.png
		?g=0;?d=1;PIC 5,data/yukiko04.png
		?g=0;?d=1;"【由希子】\n「状況からみて、.name.おにいちゃんが最も犯人として疑わしいのは間違いないわっ!」";!e=1;[JUMP]
[JUMP]命令がいたるところに配置してあるが、これは処理を少しでも軽くする為の配慮である。これより下のフラグチェックはする必要が無いのがわかっている為、[JUMP]命令をつかってコマンド入力直前に処理をとばしている。
フラグチェックの命令は確かに値が有効じゃなければ、以下の処理は実行しない…が、フラグチェック自体の処理はする為、繰り返せば負荷は少しずつ大きくなる。
なので、以下のフラグチェック自体をする必要が無いのがわかっているので、ジャンプしているというわけです。

これは無理にやる必要は無いが、処理が重いと感じた場合の、解決策の一つとして知っておくと役に立つかもしれません。