10 月 08 2008

PV3Dでレースゲーム制作 20 - リプレイモード搭載

Posted by tanjo at 3:24 AM

ドライビングに関わるキー入力を記録→それを再生して車を走らせる、という流れでリプレイを作ります。キー入力だけなら1つのint値に収めることができ、座標やら回転やら荷重やらを記録するよりもだいぶコンパクトに処理できます。

キーの組み合わせを整数値に変換

たとえば、記録用の変数を用意したとして [左]が押されたら +1、[右]が押されたら +2、[アクセル]なら +4、[ブレーキ]は +8、のように設定しておけば、13 = [左] + [アクセル] + [ブレーキ] のように、0~15までの整数でどの組み合わせだったかを判断できます。

…と言うと一見すごそう?に思えるけど、2進数で書くと、[左]は +1、[右]は +10、[アクセル]は +100、[ブレーキ]は +1000 だから、1101 = [左] + [アクセル] + [ブレーキ] と、0~1111までで表現できるのは当たり前でした。(そんなことに3年も気づかなかった自分orz)

これをコードにするとこんな風になります。
まずは記録のしかた。keyPress○○ は Boolean です。

var drivingHistory:Array = new Array();
//--------------------------
//以下、メインループから呼び出し
drivingHistory.push(
	int(keyPressLeft)
	+ (int(keyPressRight) << 1)
	+ (int(keyPressSpace) << 2)
	+ (int(keyPressB) << 3)
	+ (int(keyPressDown) << 4)
);

一方再生は…

//メインループから
var input:int = drivingHistory.shift()
keyPressLeft = Boolean(input & 1);
keyPressRight = Boolean((input >> 1) & 1);
keyPressSpace = Boolean((input >> 2) & 1);
keyPressB = Boolean((input >> 3) & 1);
keyPressDown = Boolean((input >> 4) & 1);

RGB抽出のときと似ていますね。ビットシフトと論理積。
記録するときは2進数の各桁に false=0 か true=1 を代入し、再生時は逆に各桁が 1=true かどうかをチェックしてフラグを立てています。

リプレイモードへ

あとは、1周したとか、適当なタイミングで記録モードと再生モードを切り替えてあげればOK。切り替えるときに車の座標などいろいろな変数をリセットし、前回作ったリプレイ用カメラへ移行します。これでついにリプレイモードの完成です!

デモ

レースゲームデモ画面

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

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

1周走るとリプレイが再生されます。
でもごめんなさい、1周するには1分もかかります。

Leave a Reply