私が現在製作中のC言語+DXライブラリを用いた三次元シューティングゲームでは、
キャラクタの行動フラグの中に、下に示す射撃を管理するフラグが用意されていました。 TPSなので、キャラクタの射撃方向は視点の真正面になります。
そこで、「キャラクタが撃っている間と射撃中止から60フレーム経過までは正面を向いて、60フレーム後からは進行方向を向く」処理をさせたい時、 下記のように実装していました。
if( Pc.Flag.Shot || 射撃をやめてからの時間<60 ){
正面を向く;
} else {
進行方向を向く;
}
// プログラム内のどこか
if(プレイヤが射撃ボタンを押す){
Pc.Flag.Shot = 1;
弾を出す;
} else {
// 直前まで撃っていたが今やめた
if( Pc.Flag.Shot ){
射撃をやめてからの時間=0;
}
Pc.Flag.Shot = 0;
}
// main関数内のループ
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 ){
略
射撃をやめてからの時間++;
略
}
下に示す新たなフラグ(じゃないような気もしますが…)、変数を用意し、同じ処理をさせました。
結果、処理が体感できるほどに高速になったように感じます。
if(Game.Frame - Pc.Flag.LastShotFrame < 60){
正面を向く;
} else {
進行方向を向く;
}
// どこか
if(プレイヤが射撃ボタンを押す){
Pc.Flag.LastShotFrame = Game.Frame;
弾を出す;
}
// main関数内のループ
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 ){
略
Game.Frame++;
略
}
もし、他にもっと効率的な行動管理手法があるならばご教授お願いしたく思い、投稿させていただきました。
前者は、0と1でその行動をとっているか取っていないかを管理する手法。
後者は、その行動を取った最後の時間だけを管理する手法。
他にも管理方法があれば教えてください。よろしくお願いします。