特に両者は関連はないのですが、いつかはやらなければならないテーマ「FlashでFlash暗算ゲーム」を作成します。
setInterval()を利用したFlash暗算ゲーム
Adobe Flash CS3 Professionalを使用してサンプルを作成しています。

連続して厳密な感覚で出題するための「setInterval()」

FlashでFlash暗算
1. ここからサンプルのFlashをここからダウンロードしてください。レイヤー「action」には「start(ゲーム開始)」「ready(出題準備)」「question(出題中)」「answer(解答入力)」「aTrue(正解)」「aFalse(不正解)」とラベルが付けられていて、それぞれ「()」の状態で使用する画面となっています。画面遷移などのActionscriptは既に記述されています。

2. 今回の制作フローは以下の通りになります。

・ ゲーム開始画面で「start」ボタンを押してゲーム開始
・ 出題準備画面を一定時間表示
・ 出題中画面で1秒おきに1桁のランダムな整数を画面に表示、連続して5問出題する
・ 解答入力画面でテキストボックスに解答入力、「Answer」ボタンを押すことで判定
・ 正解の場合画面に「正解と表示」
・ 不正解の場合画面に「正解を表示」

3. レイヤー「action」のラベル「question」に以下のActionscriptを記述してください。
stop();

qTime = 0;
aNum = 0;
arithmeticInt = setInterval(arithmetic,1000);

function arithmetic(){
	if(qTime == 5){
		clearInterval(arithmeticInt);
		gotoAndStop("answer");
	}else{
		qNum = Math.floor(Math.random()*10)+0;
		qText.text = qNum;
		qTime += 1;
		aNum += qNum;
	}
}
1行目でフレームの再生を停止しています。
2・3行目で使用する変数を初期化しています。
4行目で「setInterval()」を使用しています。ここでは「1000ミリ秒(=1秒)」おきに関数「arithmetic」を実行しています。

5行目以降が関数「arithmetic」です。
最初のif文で比較している変数「qTime」は出題回数を管理する変数です。5回出題したいので、ここでは「5」を入力します。
まず、5回出題が終わった場合からです。1行目で実行している「setInterval()」を「clearInterval()」を使用して停止しています。
2行目で解答入力画面へ移動させています。

次に後半の出題部分です。1行目では出題する整数を管理する「qNum」へランダム関数を利用して、「0~9」までの整数を入力しています。
2行目で問題を表示するテキストボックス「qText」へ、「qNum」の値を代入し表示しています。
3行目では出題回数をカウントアップしています。
4行目で正解を管理する変数「aNum」に出題した値を足しています。これが5回繰り返し出題部分は完成です。


4. レイヤー「action」のラベル「answer」に以下のActionscriptを記述してください。
stop();

btAnswer.onRelease = function(){
	if(aText.text == aNum){
		gotoAndStop("aTrue");
	}else{
		gotoAndStop("aFalse");
	}
}
1行目でフレームの再生を停止します。
2行目から「answer」ボタンをクリックしたときの処理を記述しています。
3行目からが正否の判定です。入力テキストボックス「aText」の内容が正解の値「aNum」と一致しているかを判定しています。
一致の場合、正解画面の「aTrue」へ、不一致の場合、不正解画面の「aFalse」へ移動します。

5. 正解の場合は「正解」と表示するだけですが、不正解の場合は正解を表示します。レイヤー「action」のラベル「aFalse」に以下のActionscriptを記述してください。
stop();

fText.text = aNum;
btRetry.onRelease = function(){
	gotoAndPlay("ready");
}
2行目で正解を表示するテキストボックス「fText」に正解の値「aNum」を代入しています 。



これで完成です!
完成したファイルをダウンロード


作例が簡単過ぎましたか?私の暗算レベルに合わせてしまったようです。今回のように「setInterval()」は連続して繰り返す処理に関してFPSに依存せず、フレームを利用する場合に比べて正確に表示することが可能です。といっても数千分の1秒での処理となると当然処理に遅延は発生し、長時間繰り返すことで遅延は大きくなってしまいます。時間を計る用途であれば「DateObject」を使用し、間隔をフレームよりは正確に表示したい場合は「setInterval()」を使用するといったように使い分けが必要です。


■All Aboutで「毎月の家計」について、アンケートを実施中です!
回答いただいた内容をAll About記事企画の参考にさせていただきます
※毎月5名の方にAmazonギフト券1000円分をプレゼント

「毎月の家計についてのアンケート」に回答する


※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。