今回はボスがダメージを負うごとにその攻撃&移動パターンを変化させるようにしてみましょう。パターンは三つ作ったので、ボスのHPが2/3以下になったら第二パターン、1/3以下になったら第三パターンになるように変化させるようにします。ボスのHPを計算をすることになるので、ボスのHPをdefine.hで定義しておきます。500また、boss.cppのコンストラクタでボスの初期HPもこれで設定しておきます。次の攻撃パターンに移るようにさせます。その攻撃パターンが変化する間にプレイヤーの攻撃があたってしまうと卑怯なので、その間はボスが無敵になるように無敵フラグを設けます。false;当然宣言はboss.hで、初期値の設定はboss.cppで行っています。GetNodamageFlagという関数を作ります。no_damage;}これも宣言はboss.hでpublicで宣言し、定義部分はboss.cppに書いています。次にボスがパターンを変化させる際に、一度真ん中上部付近に移動しますが、その部分の関数MoveToDefault関数を作ります。false;//移動パターンが3ならif(move_pattern==3)MoveInit(200,160,2);}}これはprivateで宣言しています。外部から呼び出す必要はないので。仕組み的には移動パターン3と同じにしてあります。angleが90に達したら、指定した位置まで移動したことになるので、SetMovePatternとSetShotPattern関数を使ってパターンを変更しています。この関数は以下のようにprivateで定義しています。pattern;}prev_move_patternとprev_shot_patternという変数は、boss.hにint型で新たに宣言しておきました。実際のパターンmove_patternとshot_patternの値を変更してます。何もしていないので、shot関数のswitch文のところで、default://何もしないbreak;のように書いてるだけです。4の時の処理は書いてないのでdefaultの部分の処理が実行されます。次のパターンへの変更を行っています。no_damageフラグも指定した位置まで移動したらもう無敵である必要はなくなるので、フラグを戻しています。上記のように設定しています。このMoveToDefault関数は移動パターン4とします。ゆえに移動パターン関数を制御しているMove関数は以下のようになります。4:MoveToDefault();break;}}つまり、ボスが移動パターンを変化させる際はmove_pattern変数を4に変更する必要があります。MoveToDefault関数はMovePattern3と同じ仕組みを使っているので、angle変数やprev_x,prev_y,movey,movex等の変数の値のセットが必要です。その設定を行うSetDamageSetting関数を作ります。true;SetMovePattern(4);SetShotPattern(4);}prev_x,prev_yはボスの座標をセットしておき前回座標とします。真ん中上部付近の定位置の座標である(200,80)までの距離を求めています。angle変数を0にし、無敵フラグno_damageフラグを立てています。MoveToDefault関数の移動パターンである4に移動パターンを設定しています。ショットパターンも特に何もしない4に設定してあります。最初に言ったとおりボスのHPの減少具合を基にパターンを変化させると言いました。判定させるかというと以下のような判定方法をつかいます。BOSS_HP*2/3){これはcontrol.cppのコードの一部です。bhpというのがボスの現在のHPでGetPrevHp関数がボスの前回のHPを返す変数です。前回HPがボス初期HPの2/3より大きい条件は1度しか起こりえません。この条件式ならそれをクリアできます。パターンごとにフラグを設ける方法もありますけど、このほうが手っ取り早いのでこの方法を使いました。いうことで、前回HPを取得するGetPrevHp関数をpublicでBOSSクラスに定義します。prev_hp;}prev_hpという変数は新たにboss.hで宣言してます。単純にこの値を返すだけです。このprev_hpの値はどこで設定しているのか?というと、ボスのHPを減らすかんすうであるHpSet関数内で設定しています。hp;}ダメージを減らす前にhpをprev_hpに代入しているので、prev_hpが前回HPになるというわけです。定義した関数を呼び出すだけです。以下はBossCollisionAll関数の一部のコードです。//まず無敵フラグがたってないかをチェック。BOSS_HP*2/3){//ダメージエフェクトを出すEnemyDeadEffect(bx,by);//ダメージ音を鳴らすedead_flag=true;//さらに得点を加えるscore->SetScore(CURRENT_SCORE,1000);//アイテムを出す。z=0;z<ITEM_NUM;++z){if(!item[z]->GetFlag()){//アイテムの初期座標をばらけさせる。BOSS_HP/3){//ダメージエフェクトを出すEnemyDeadEffect(bx,by);//ダメージ音を鳴らすedead_flag=true;//さらに得点を加えるscore->SetScore(CURRENT_SCORE,1000);//アイテムを出す。z=0;z<ITEM_NUM;++z){if(!item[z]->GetFlag()){//アイテムの初期座標をばらけさせる。if(bhp<=0){//フラグを戻すboss.SetFlag(false);//消滅エフェクトを出すEnemyDeadEffect(bx,by);//消滅音を鳴らすedead_flag=true;//さらに得点を加えるscore->SetScore(CURRENT_SCORE,10000);//アイテムを出す。z=0;z<ITEM_NUM;++z){if(!item[z]->GetFlag()){//アイテムの初期座標をばらけさせる。ix=(rand()%100-51)+bx;iy=(rand()%100-51)+by;item[z]->SetFlag(ix,iy,rand()%2);++itemnum;//10個出したらループを抜けるif(itemnum==10){break;}}}}}}}}まずGetNodamageFlag関数で無敵フラグがたっていないかチェックしてます。立っていなければ通常の当たり判定の処理に移っています。先ほど説明したHPが2/3以下になった時のコードが書かれています。ボスが消滅したときと同じようにエフェクトを出しています。今回はボス消滅時と同じエフェクト、同じ音を使ってます。得点を少し加えたあと、アイテムを5個出現させてます。消滅時は10個ですが、ダメージ時は5個と少なくしたほうがゲームっぽいですしね。これと同じ処理をその下のBOSSのHPが1/3以下になったときの条件式のところでもやっています。今回は1/3なので単純にBOSS初期HPを3で割った値で比較してるだけです。ココまでのソースコードはコチラですソースコード(33章)音声ファイルや画像ファイルは各自でそろえてください。移動&攻撃パターン変化~消滅まで動かせることができるようになります。次回はボスダメージ時の画面揺らしを実装してみようかなと思っています。メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。TOPページのデザインを変更。相互リンクページに、複数サイト追加。C言語学習ページ発展編(1~9章)追加。HTML/CSSリファレンスのページ追加。