9 月 10 2008

PV3Dでレースゲーム制作 15 - タイムアタック機能

Posted by tanjo at 10:05 PM

ようやくタイムアタック機能の実装です!ゲームだけしたいかたは下の方にスクロースしてね。

前回までで周回を正しく判定することができるようになりました。なので、あとは「周回が始まってから~次の周回になるまでの累計フレーム数」をカウントしていけばいいだけです。新しい周に入ったら、またゼロからカウントし直す、と。
内部処理ではラップタイムはフレーム数で扱っています。処理しやいからです。分・秒・小数に変換するのは表示の時だけでいいでしょう。
1つ前の周のカウント数とか、累計カウントの最小値とかを変数に保存しておけば、それぞれラスト・ラップタイム、ファステスト・ラップタイムが作れます。おお、レースゲームっぽい!

この辺の処理はあまりにフツーですので割愛させてもらうとして、今回は取得したフレーム数を「XX分YY秒ZZ」と2桁区切りの時間に直す方法を紹介したいと思います。

まずは、フレームを分、秒、小数に変換します。

function frameToTime(frames:int):Array
{
	var time:Array = new Array();
	var fr:Number = stage.frameRate;
	time[0] = Math.floor(frames / (60 * fr));          //分
	time[1] = Math.floor((frames % (60 * fr)) / fr);   //秒
	time[2] = Math.floor((frames % fr) * 100 / fr);    //小数
	time[0] = zeroPadding(time[0], 2);
	time[1] = zeroPadding(time[1], 2);
	time[2] = zeroPadding(time[2], 2);
	return time;
}

フレーム数の int 値を引数に、分、秒、小数の整数値を配列に格納しています。
でもこれだけだと数値が2桁だったり1桁だったりバラバラです。そこで、必ず2桁になるように、数値を文字列値に変換してから配列を返しています。

数値を任意の桁数に直す関数。

function zeroPadding(number:Number, size:uint):String
{
	var str:String = number.toString(10);
	while (str.length < size)
	{
		str = "0" + str;
	}
	return str;
}

「ゼロパディング」と言うそうです。第1引数の桁数が第2引数の設定に満たないときは、頭に「0」を付け足して揃えてくれます。これくらい ActionScript の標準クラスにあるんじゃ…と思ってたけど、どうやら無いみたいでした。
ActionScriptでゼロパディング - 続・ken39arg を参考に、じゃなくて、そのまんま使っています。

実際にこれらを使用するには、たとえば累計フレームのカウント数が lapTime = 2345 だったとすると、

var lapTimeArr:Array = frameToTime(lapTime);
trace("TIME : " + lapTimeArr[0] + "'" + lapTimeArr[1] + "." + lapTimeArr[2]);

これを実行すると

TIME : 01'18.16

と返ってきます。

久々のデモ!

が、しかし、たいして進展したように見えません。。。

ゲームをプレイする

ゲームをプレイする (要:Flash Player 9.0.115.0以降)

*このゲームのソースファイル Main.as はこちらから参照できます。

今回からFlexコンパイルに移行しました。ソースも以前よりはスマートにしたつもりです。主な追加機能は、データファイルのプリローディングとタイムアタック。動作が重いときは「右クリック」 > 「画質」 > 「低」を選んでください。

ちなみに私の最速タイムは 00′50.96 でした。

Leave a Reply