第4回:Flash Liteでゲームを作ろう!

第4回←教材はこれ!

  • 時計待ち受け作るだけで目的達成なんだけどせっかくなんでもうちょい勉強。
  • 上下キーしか使えないので数字キーを使っての操作と。
  • 今回作るゲームは表示された数字の早押しゲーム。
  • 自分のケータイにサンプルファイル転送して遊んでみる。ちゃんと動く。
  • 基本的に文字は画像ベース。フォントによる機種依存がないため。
  • 最初の画面のスタートボタンに次のスクリプト

on (press, keyPress "0") { ←二つ同時に指定できる!
gotoAndPlay("setNo");
}

  • ボタンが押されるか、数字の「0」が押されたら「setNo」に飛ぶと。
  • そして同じく第1フレームには変数の初期化として以下のスクリプト

countOK = 0; //成功カウント
countNG = 0; //失敗カウント

  • この二つの変数を使って得点計算をすると言うことですね。
  • スタートボタンの背景矩形がステージをはみ出してるのは、機種によってステージ幅比が異なった場合のため。
  • このゲームのメインとなるsetNoフレーム。
  • 至る所にスクリプト書かれてて面倒な印象(笑)
  • 最初に実行されるのが以下のスクリプト

rNo = random(10);//表示する数字をランダムで選定
rndNo.No = rNo;//ランダムの数値を表示させる

rndNo._x = random(200) + 20;//数値の表示位置をランダムで配置
rndNo._y = random(140) + 20;

play();//再生

  • このスクリプトの2行目で指定されている「rndNo.No」については、ステージ外の左側にある「数字」のムービークリップ(インスタンス名:randNo)の数字オブジェクトの中にはダイナミックテキスト(変数名:No)が配置されている。
  • このタイムラインは11フレーム目でplay()されると25フレーム目まですすむ。
  • 25フレームには次のスクリプトが。

//時間切れの場合は失敗カウント+1
countNG++;

//数値表示処理へ戻る
gotoAndPlay("setNo");

  • このフレームに来るまでに数字キーが押せなかったら時間切れで失敗カウント「countNG」が+1される。
  • で、25フレームまでに数字が押された場合の処理が、ステージ外の左側にある「空ボタン」に以下のように記述されている。

on (keyPress "0") {
   if (rNo==0) {
        call("hit");
    } else {
        call("miss");
    }
}

on (keyPress "1") {
   if (rNo==1) {
        call("hit");
    } else {
        call("miss");
    }
}

//途中省略

on (keyPress "9") {
    if (rNo==9) {
        call("hit");
    } else {
        call("miss");
    }
}

  • 変数「rNo」の値と比較して同じであればラベル「hit」へ、違っていればラベル「miss」へ。
  • ここでcall()関数について。

ここでポイントとなるのが、call()関数です。Flash Lite 1.1ではfunctionを使用できません。そのため、このcall()を代用することになります。call()では引数としてフレームの番号またはラベルを指定し、そのフレームのスクリプトが実行させることとなります。

  • なるほど単純にgotoAndPlayとは違ってそのラベルに行ってスクリプトの実行をすると。
  • 「miss」のスクリプトは失敗カウント「countNG」が+1されるだけ。
  • 「hit」のスクリプトは以下。

//成功カウント+1
countOK++;

//再生を停止
stop();

//数字が弾けるアニメーションを再生
tellTarget("/rndNo") {
play();
}

  • 実はムービークリップ「rndNo」には数字が弾けるアニメーションが続きに用意されており、それを再生させる。
  • そしてもちろんその弾けたアニメの最終フレームには次のスクリプト

//成功した場合はルートの再生が停止するので
//数字が弾けるアニメーション終了後に、
//ルートを数字表示処理から再生させる
tellTarget("/") {       ←この指定自体が分かるようなわからんような。。。
gotoAndPlay("setNo");
}

//数字は最初に
gotoAndStop(1); ←このムービークリップ自体も1フレーム目へ

  • はいそんで、ここまでの仕組みだと新たに数字が出てくると永久に繰り返してしまうので、全体制御に関してが3ページ目。
  • 時間制限を設けるためにタイムバーのムービークリップを設置。
  • 20秒(12fpsで240フレーム)でタイムバーの最終フレームへ。そこに記述されるスクリプトが以下。

tellTarget("/") {
    gotoAndStop("end");
}

  • ゲームの結果画面、ラベル「end」のフレーム。記述されるスクリプトは以下。

stop();

//得点の計算
point = countOK - countNG;

//得点によってメッセージを変更
if (point <= 0) {
    tellTarget("info") { gotoAndStop(1); }
 } else if (point > 0 and point <= 10) {
    tellTarget("info") { gotoAndStop(2); }
 } else if (point > 10 and point <= 15) {
    tellTarget("info") { gotoAndStop(3); }
 } else if (point > 15 and point <= 20) {
    tellTarget("info") { gotoAndStop(4); }
 } else if (point > 20) {
    tellTarget("info") { gotoAndStop(5); }
}

  • ここで結果表示にムービークリップ(インスタンス名:info)が使われている。各フレームにそれぞれの結果を用意している。
  • そんなわけで全体的にゲームブックのパラグラフ分岐的な趣き。プログラムっぽくないけど分かりやすいかも。
  • 最後にバイブ機能を使う場合についての記述が。

バイブレーター機能を用いる場合は、fscommand2()を使用して下記のように記述します。

fscommand2("StartVibrate", [オンの時間], [オフの時間], [繰り返し回数]);
fscommand2("StopVibrate");

 下記の例では、バイブレーター機能を2.5秒間オン/1秒間オフを2回繰り返します。

fscommand2("StartVibrate", 2500, 1000, 2);

  • 「StartVibrate」と「StopVibrate」は対にする必要ないってことかな?