シューティングゲーム作成入門トップに戻るグレイズを実装しよう今回はグレイズを実装してみましょう。小さい白い玉を徐々に透過&縮小させながら、四方八方にランダムで飛び散らせるようにします。画像はコチラを使います。そのためのGRAZEクラスを作成します。All();};グラフィックハンドルはstatic指定子をつけて、変数を共有するようにしています。グレイズの一つ一つは全て同じ画像を使うので、何回も同じ画像を読み込むとリソースの無駄になるからです。その他は、グレイズが飛び散る角度やアルファ値、拡大率等の変数を用意してます。次にコンストラクタです。GRAZE::GRAZE(){x,y=0;//初回だけ読むif(gh==0){gh=LoadGraph("graze.png");}rad=rate=0;alpha=255;flag=false;count=0;srand((unsigned)time(NULL));}変数ghを0かどうか判定して0なら画像を読み込むようにしています。ghが0の時は初回だけなので、最初のインスタンスが生成されたときだけ画像が読み込まれます。その他の変数は初期値をセットしたり、乱数を初期化したりしています。次に座標の移動やアルファ値などの計算を行っているMove関数とDraw関数とAll関数です。GRAZE::All(){if(flag){Move();Draw();}}弾がかすったときに飛び散らせる白い玉は、毎回ランダムで角度を設定します。カウントが0の時に、円一周分のラジアンの中からランダムで計算された値を代入しています。アルファ値や拡大率は、20カウントで一番小さい値になるように計算してます。詳しい説明や今までと一緒なので省略します。座標の計算部分も今までの弾の移動と同じなので省略します。カウントが20になったら、カウントとフラグを元にもどしています。Draw関数はまずアルファブレンドモードにして、計算されたアルファ値を指定してます。その後DrawRotaGraph関数を使って、計算された座標、拡大率等を指定し描画しています。All関数はフラグが立っているときだけ、Move関数とDraw関数を実行するようにしています。次に外部からフラグを取得するための関数と、フラグと座標の設定を行うための関数を定義します。引数に渡された座標をセットして、flagをtrueにするだけのSetFlag関数です。次に当たり判定のコードを書きたいところですが、もう一つしておかなければならないことがあります。グレイズは一つの弾につき一回にしなければならないことです。一つの弾につき何回もグレイズができるようにすると弾が接近している間はずっとグレイズが発生することになってしまうからです。敵の弾の構造体に、一度弾がかすったかどうかを示すフラグ用の変数を持たせます。gflag;//グレイズ判定用フラグ};敵の弾構造体のE_SHOT構造体に新たにbool型のgflagという変数を持たせました。一度弾がかすった場合は、このフラグを立てるようにします。このフラグを設定するための関数と取得するための関数をENEMYクラスに定義します。shot[index].gflag;}両方とも引数には弾の添字を指定します。SetGrazeFlag関数は該当の弾のgflagをtrueにし、GetGrazeFlag関数は該当の弾のgflagをリターンしてるだけです。次に当たり判定部分のコードです。CONTROLクラスのCollisionAll関数です。z=0;z<GRAZE_NUM;++z){if(!graze[z]->GetFlag()){graze[z]->SetFlag(px,py);break;}}//グレイズ音セットgraze_flag=true;}gtempflag=false;}if(tempflag){//操作キャラのdamageflagを立てるplayer->SetDamageFlag();//弾を消すenemy[i]->SetShotFlag(s,false);//プレイヤー消滅音フラグを立てるpdead_flag=true;//一時フラグを戻すtempflag=false;}}}}}}}switch分の部分のコードを見てください。実際のプレイヤーとの当たり判定の前にグレイズの当たり判定を行っています。10と定義しています。当たっていれば、一時変数のgtempflagをtrueにしてます。同じことを他の種類の弾に対しても書いています。switch文を抜けてすぐ、グレイズ時の処理を書いています。GetGrazeFlag関数でフラグが立っていないかをチェックしています。立っていなければまずそのフラグをセットし、あらかじめ生成しておいた先程のGRAZEクラスのインスタンスgraze配列の中から、フラグが立っていないものを探し出し、値をセットしています。GRAZE_NUMという定数はdefine.hで定義しており、コンストラクタGRAZEクラスのインスタンスを生成してますが、コードは省略します。その後グレイズ用のサウンドフラグを立てて、一時変数を元に戻してます。サウンドファイルの読み込み・再生のコードは省略します。後は以下のようにAll関数で、GRAZEクラスのインスタンスからAll関数を実行するだけです。i=0;i<EFFECT_EDEADNUM;++i){if(effect_edead[i]->GetFlag()){effect_edead[i]->All();}}SoundAll();++g_count;}このようにプログラミングすることで、以下の動画のようにグレイズを実装することが出来ます。大体ゲームの骨格は固まってきましたね。今回の説明は以上です。次回はスコアボードを表示してみましょう。メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。TOPページのデザインを変更。相互リンクページに、複数サイト追加。C言語学習ページ発展編(1~9章)追加。HTML/CSSリファレンスのページ追加。