PR
図4●テキストツールのアイコンを選択したところ
図4●テキストツールのアイコンを選択したところ
[画像のクリックで拡大表示]
図5●テキスト・フィールドのプロパティ画面
図5●テキスト・フィールドのプロパティ画面
[画像のクリックで拡大表示]
リスト1●絵柄がそろったら得点を加算し,そろわなかったら減点するコード
リスト1●絵柄がそろったら得点を加算し,そろわなかったら減点するコード
[画像のクリックで拡大表示]

テキスト・フィールドに
変数の値を表示する

 変数scoreを宣言したところで,この変数の値を画面に表示してみましょう。最も手軽な方法はテキスト・フィールドを使うことです。

 テキスト・フィールドを画面上に配置するには,テキストツールを使用します。[ツール]パネルでテキストツールのアイコンをクリックし(図4[拡大表示]),ステージ上にテキスト・フィールドを配置してください。位置や大きさはここではさほど気にする必要はありません。

 次に,メニューから[ウィンドウ]-[プロパティ]とたどり(あるいは[Ctrl]+[F3]),[プロパティ]パネルを表示します(図5[拡大表示])。ここで[テキストの種類]ドロップダウン・リストボックスから「ダイナミックテキスト」*5を選択し,その下の[インスタンス名]欄に「score_txt」と入力します。これで,「score_txt」という名前で参照できるテキスト・フィールドができあがりました。[プロパティ]パネルではほかに,WとHの欄でテキスト・フィールドの幅と高さ,XとYの欄で表示位置を指定したり,表示文字のフォントやフォント・サイズを選べます。

 [テキストの種類]としてダイナミックテキストやテキスト入力を指定したテキスト・フィールドは,TextFieldクラスのインスタンスとして扱われます。TextFieldクラスをオンライン・ヘルプで調べてみると,値の取得/変更にはtextプロパティを使えばよいことがわかります*6

 得点を表示する処理は,頻繁に行うことになりそうですので,showScoreという名前の関数にしておきましょう。メインのタイムラインの5フレーム目を選んで[アクション]パネルを開き,次のコードを追加します*7

function showScore() {
//スコアの表示を更新する関数
score_txt.text =
"SCORE:" + score;
}

 得点は,スロット・ゲームの窓のアニメーションを開始するstartボタンを押したときと,三つの窓のアニメーションがすべて停止したときに表示させます。まず,startボタンを押したときに実行されるstartReels関数の最後に次のように,showScoreを呼び出すコードを追加します。

function startReels() {
//三つのリールの再生を開始する
reel1.play();
reel2.play();
reel3.play();
showScore();
}

 ここまで修正したところで,メニューで[制御]-[ムービープレビュー]と選んで(あるいは[Ctrl]+[Enter]),ムービープレビュー画面で動作を確認してみましょう。5フレーム目までムービーが再生されたところでいったん停止し,startボタンを押したタイミングでテキスト・フィールドに「SCORE:100」と表示されますね。

絵柄がそろったかどうかを
判定するコードを記述

 得点を表示する仕組みができましたら,次は得点を加算したり減算する仕組みを作りましょう。まずは単純に,「三つの窓のアニメーションが停止した時に,同じ絵がそろっていれば30点加算」という処理を考えます。

 ここでは,三つの窓が得点の判定が行える状態であるどうかを判定するために,アニメーションが停止しているかどうかの状態を表す変数を追加します。三つの窓に対応するインスタンス「reel1」「reel2」「reel3」にそれぞれ,isStopというプロパティ(変数)を設けて,その値で判定します。ちなみに,状態を表す変数を一般にフラグ(flag,旗)と呼びます。

 フラグの初期化は,startボタンを押したタイミングで行うのが良さそうです。startReels関数の最後に,各窓のインスタンスのisStopプロパティをfalse(偽)で初期化するコードを追加します*8

function startReels() {
//三つのリールの再生を開始する
reel1.play();
reel2.play();
reel3.play();
showScore();
//それぞれのリールの
//isStopプロパティを初期化
reel1.isStop = false;
reel2.isStop = false;
reel3.isStop = false;
}

 次に,それぞれのstopボタンを押したときに,対応する窓の番号を引数に受け取って処理を行うstopReels関数を,リスト1[拡大表示]のように修正します。

 まず(1)では,ifステートメントを使って,インデックス番号に対応する窓(リール)が,すでにアニメーション(回転)を止めているかどうかを判定しています。ActionScriptにおけるifステートメントの基本構文は,

if (条件式) {
//条件式がtrue(真)の場合に
//実行する処理
}else{
//それ以外の場合に実行する処理
}

です。(1)では,条件式がreels[index].isStop,すなわち引数で指定した窓のisStopプロパティの値を判定しています。isStopがtrueの場合は,すでにアニメーションが止まっていますからtraceステートメントでメッセージを表示し,そうでない場合にはelse内の処理を実行します。

 else内部の(2)では,窓のアニメーションを止めて,isStopの値にtrueを指定します。続く(3)は,三つの窓のアニメーションがすべて止まっているかどうかを調べて,すべて止まっている場合にだけ(4)の処理を行います。

 (5)のforステートメントを使ったループ処理では,三つの窓の絵柄が同じかどうかを判定して,結果をフラグ用の変数tmpFlgに格納します。ActionScriptでのforステートメントの基本構文は,

for (ループの開始前に評価される式;
条件式;
ループ実行後に評価される式) {
//ループ処理
}

となります。「ループの開始前に評価される式」の結果が「条件式」を満たしている場合には,ループ処理として記述された内容を実行します。1回のループ処理が終わるごとに,「ループ実行後に評価される式」が評価され,その結果が「条件式」を満たしている間はループ処理を繰り返し,満たしていなければ処理を抜けます。(5)では,配列変数reelsの長さ(要素の数)だけ処理を繰り返すことになります。

 ループ処理では,各窓の_currentframeプロパティの値*9が等しいかどうかを調べて,その結果とtmpFlgの値で論理積を取った結果を,tmpFlgに代入しています。窓の絵柄がすべて同じ場合には,ループ処理終了にtmpFlgの値がtrueになり,一つでも違うとfalseになります。あとは(6)のifステートメントでtmpFlgの値を判定し,trueであれば得点を30点加え,falseであれば10点減らします。

 [ムービープレビュー]で確認をしてください。最初に得点が100与えられ,窓の絵柄が全部そろったら30点加算され,そろわなかったら10点減点されます。かなりゲームらしくなってきましたね。

下記のURLから、サンプル・プログラムを無償ダウンロードできます。
http://software.nikkeibp.co.jp/software/download/down04c.html#200410