9 月 10 2008
PV3Dでレースゲーム制作 15 - タイムアタック機能
ようやくタイムアタック機能の実装です!ゲームだけしたいかたは下の方にスクロースしてね。
前回までで周回を正しく判定することができるようになりました。なので、あとは「周回が始まってから~次の周回になるまでの累計フレーム数」をカウントしていけばいいだけです。新しい周に入ったら、またゼロからカウントし直す、と。
内部処理ではラップタイムはフレーム数で扱っています。処理しやいからです。分・秒・小数に変換するのは表示の時だけでいいでしょう。
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 でした。
