できる限りそういったものはメッセージにしていきたいです。
例えばDAMAGEというメッセージがオブジェクトに送られたらダメージ処理を行う、
EFFECTというメッセージが送られたらエフェクト処理を行う、といった具合です。
そしてDAMAGE | EFFECTとして渡したらダメージとエフェクトを同時に処理します
そんな感じの処理を書いてみました。
for( int i = 0 ; i position.x;
float* y = &enemy[i].Pos()->position.y;
action[i].get()->update();
animation[i].get()->update();
if( enemy[i].Hp() update(); //ショット計算
effect[i].get()->update(); //エフェクト計算
/****************/
/*メッセージ処理*/
/****************/
onMessageEvent( i );
}
エネミーに何かしらのイベントがあった場合、
そのイベント情報をメッセージとして渡します。
onMessageEvent( )という関数でそのメッセージの処理を行います。
void ArcadeEnemy::onMessageEvent( int i )
{
/*
メッセージを右シフトして0になるまで
(オーダーがない地点に達するまで)処理を行う
*/
for( int bitShift = 0 ; ( enemy[i].Message() >> bitShift ) != 0 ; bitShift++ ){
switch( enemy[i].Message() & ( 0x01 > bitShift ) != 0 ; bitShift++ ){
}
でメッセージの値が0ではない間、右シフトしてメッセージを探し続けます。
enemy[i].Message() & ( 0x01 << bitShift )
で、何番目のメッセージであるかを取得します。
0回目のループの場合は右の値が0x01になり、
1回目なら0x02、
そこから0x04、0x08、0x10。。。といった具合にシフトされていき、
メッセージと&演算して求めます。
仮に
EM_HIT = 0x01 , 0001
EM_DEATH = 0x02 , 0010
EM_EFFECT_ORDER = 0x04 , 0100
として、オーダーする内容が EM_DEATH | EM_EFFECT_ORDERだとするなら
二進数では 0110 となります。
最初のループでは
0110
0001 (&
=======
0000
で評価されず、
次のループで0x01が1ビット左にシフトされ、
0110
0010 (&
=======
0010
となるので死亡処理が呼ばれます。
次のループで0x01が1ビット左にシフトされ、
0110
0100 (&
=======
0100
となり、エフェクトがオーダーされます。
という感じにするとより感覚的にプログラムが組み立てれるようになってきたかも