複数のプレイヤーを個別にとる場合を考える。
プレイヤーとマップモデルが衝突したときに、アニメーションを再生させる場合などは
初回ヒット(trigger)と毎回のヒット判定(hold)で判定を分ける必要がある。
初回ヒット時のみ、ヒットしたモーションを再生させる、といった感じです。
クラスメンバにhitMaskというint型を定義
hitMaskには毎回のヒットフラグを記憶させます。
for( int i = 0 ; i = 0 && i < max_player );
// 衝突した!!
if( isCollision() ){
// &演算した結果0の場合、
// 前回の判定ではヒットしていなかったということなので
// 初回ヒットとして扱う
if( ( hitMask & player_mask ) == 0 ){
model.playAnimation( ヒットしたときのアニメ );
}
// 初回でなかったときの処理
else{
}
// ヒットしたキャラのフラグを立てる
hitMask |= player_mask;
}
else{
// ヒットしていないのであればフラグを落とす
// &演算とビット反転を組み合わせることで、
// 指定のビットを確実に0にすることができる
hitMask &= ~player_mask;
}
}
配列で管理するよりエラー処理を減らせるという点。
配列だとオーバーフローとアンダーフローが発生しないように
アクセスするたびにチェックする必要がありますが、このような方法だと
初回の一回、不正な値がないかのチェックだけで済むので非常にお得
hitMask変数をあちらこちらで参照すると危険ですが、
そこはプログラマー側が注意して管理するべき部分なのでいろんなところで
不必要に値をいじったりはしないように注意するという感じです。
ということを会社で教わったので、とりあえずメモ。
ある種の定型文らしい