この記事は半年以上前の情報なので、古い可能性があります
Flashがインストールされていません
こないだ仕事でFlashでRPG風味なコンテンツを作りました(構築メンバー…私のみ)。
私はPGではなくてデザイナなので、キャラデザをしたりする方が好きなんですが、今回は仕様に沿ってひたすらscriptを書きまくるというものでした。
その中で、「1文字づつメッセージウィンドウに表示」という関数を作りましたが、これ、学生のみなさんには結構需要がありそうなので書き留めておきます。
function(=関数)は、かつてASを勉強し始めた時に、一番とっつきにくかったものです。
要は簡単に言うと、「いくつかの命令をまとめたもの」ということになりますか。
グループリーダーと、下っ端の関係に似ています。
今回の「1文字づつテキスト表示」でいくと、
という3つの機能をまとめておくためにfunction(処理のグループリーダー)を使います。
実は、まとめておかなくてもいいんですけどね。でもまとめておくと、もう1回同じことをFlashにさせたいなあ、と思った時、そのfunctionを呼び出せばいいだけなので、便利なんですよ。
では、書いてみましょうか。
本当の正しい書き方は知りませんが、結局のところ、基本的にプログラムは上から下へ実行されていくわけなので、上に書いた3つを順番に書いていけばいいだけです。
とりあえず、Flashを起動したら、1フレーム目を選択して、「アクション」パネルに書いていきましょう。
まあ、こう書いておけば、関数の設定はokなわけです。
今回は、「textEffect」という名前を勝手につけました。
で、未だにちゃんと説明できないのが「Void」です。
Flashのヘルプに
void の 1 つだけであり、とあります。どういうことでしょう?
データ型というのは、変数を作る時などに、
var hensu:Number = new Number();
とか
var textHensu:String = new String();
みたいに使って(青い字の部分)、その変数にどんな種類の値が入るのかを予め決めておくためのものです。
voidは関数に対して定義するデータ型で、
”この関数を実行したとしても、
例えば「答えは4」、とか「答えは<おはよう>」とか、
そういう返事は返さないんですよ。"
という意味ですね。
つまり、「呼んでも返事しない。やりっぱなし」関数にはVoidを、「呼ぶと返事が返ってくる」関数には何もつけない、ということかと思います。
実は、VoidやNumber,Stringなどのデータ型はつけなくても動くんですが、
設定しておいてあげると、間違ったことをした時にエラーを返してくれたりするので、できるだけつけるようにしよう、というのがAS2.0の仕様です(ただし、3.0ではつけないとダメです)。
相変わらず、説明を短くまとめるのが下手なんですが。。
まあ、次にいきましょう。まず、「文字を変数にセットする」。
var textBox で、「textBox」という名前の空き箱を用意し(好きな名前でいいです)、
:String でその空き箱に入るのは文字だよ~と定義してあげる。
ついでにその箱には”スライムベスがあらわれた!"という文字を入れる、という意味です。
”~”で囲むとそれは「文字列」という扱いになります。”2008”は2008という数字の値ではなく、「2008」という文字列です。
特に問題なし。
次。
2.「文字をばらす」ですが、これは色々なやり方が考えられますね。
文字通り、1文字づつ切り分けて配列に格納して呼び出す方法もあるでしょう。
今回は、「1文字づつ順番に表示されて見える」が実現できればいいので、substr()を使って文字列から特定の文字を切り出します。
例えば
のように使います。
インデックスは「0」から始まりますから注意してくださいね。0=1番最初の文字、になります。
これがわかれば、
・文字列を、1番最初の文字からn番目までを表示
・ある一定の間隔でnを1増やして表示を更新
を実現すれば「1文字づつ表示」が実現できるわけです。
「ある一定の間隔で何かをする」という命令には、setIntervalを使います。
これまた、onEnterFrameでやってもいいんですが、後で文字の表示を早くしたり遅くしたりする改造をしたいので、間隔を自由に設定できるsetIntervalで。
「関数」に入れたfunctionを、「間隔」に一度実行してくれます。
とりあえず一気に作ってしまいました。↓Flash上の様子
実際にctrl+Enter(Macはコマンド+return)でプレビューしてみてください。
Flashがインストールされていません
1秒づつ、文字が順番に出てきましたか?(作例ではマウスでクリックしないと始まらないようにしてあります)
最終行に注意してください。これがないと何も起きません。
functionは「呼び出されるのを待っているグループリーダー」なので、どこかで
textEffect();
のように呼び出してあげないと何もしてくれませんですよ。
実は、この段階で動いてるっちゃ動いてるんですけど、使い回すには不便です。
このソースだと次のことが問題です。
1.テキストの表示が最後まで終わっているのに、ずっと関数を呼び続ける
2.テキストの中身を自由に設定できない
3.表示間隔も設定できない
とにかく、【1】が大問題なわけです。
とっくに全部のテキストが出ているのに、裏ではひたすら1秒に1回、textDivを呼び出し続けるわけですね。
まあ、ただテキスト表示して終わり、なら特に何も弊害はないんですが、このfunctionをゲームの中で使用する場合、ムダな処理があればその分他の処理にしわよせが来てしまうことになります。
これをどうにかするために、
を必ず表示が終わった後に実行してあげる必要があります。
つまり、
・別の変数に、文字列の長さ(文字が何個あるか)を代入しておく(textBox.lengthで求められる)
↓
・count(文字列のn番目を指す)がtextBox.lengthより小さい時はtextDivを実行する
↓
・countがtextBox.lengthを越えた時点でclearInterval(Timer)を呼んで処理終了
というステップが必要になってきます。
今回はそれはソースとしては掲載しません。
上の作例では文字の表示が終わると、関数の呼び出しをやめて「表示終わり」というテキストが表示されます。
色んな感じにアレンジしてみてくださいね。