シューティングゲーム作成入門トップに戻る敵の消滅エフェクトを作成しよう今回は敵の消滅エフェクトを作成します。画像はこちらを使います。徐々に薄くしていくように描画させます。新しく、EFFECT_EDEADクラスを作成します。カウント等の変数を宣言しました。各インスタンスで共有することにします。次にコンストラクタです。EFFECT_EDEAD::EFFECT_EDEAD(){x=y=0;//画像読み込み。255;count=0;flag=false;index=0;}グラフィックハンドルについては静的変数なので、最初は0に初期化されます。初回だけ画像を読み込むことができます。先程の三つの画像を先に全部読み込んでおきます。その他は乱数を初期化したり、値を初期化しているだけです。次にMove関数です。EFFECT_EDEAD::Move(){if(flag){//初回だけ角度と添字セットif(count==0){rad=rand()%624/100;index=rand()%3;}rate=0.5+count*0.05;alpha=255-255/30*count;++count;if(count==30){count=0;flag=false;}}}flagという変数は現在エフェクトを描画中かどうかを示すフラグです。これが立っているときだけ処理を行います。カウントが0の時、つまり初回だけ角度と、どの画像を使うかを示す添字をランダムで設定してます。rand()関数によってランダムに生成された値を624で割ると余りはそれ以下の値を返すので、0~623の値を返します。それを100で割っているので、0~6.23までの値が取得できます。これで円一周分(360度)以内で、ランダムなラジアンの値を取得できます。indexは3の余りを取得してるので、0~2までのランダムな値を取得できます。その下のrateは拡大率です。初期値0.5にcount×0.05を足してます。カウントは30カウントまで増やすようにするので、最大値は約2.0、つまり元画像の2倍ぐらいになります。alphaは255の時が不透明なので、255カラ255/30×countの値を引くことで、カウントが増えていくごとに、アルファ値が減少していき、30カウントで約0のアルファ値が取得できます。最後のif文はカウントが30になったら、カウントを0に戻し、フラグをfalseに戻します。次にDraw関数とAll関数です。EFFECT_EDEAD::All(){Move();Draw();}単純にアルファブレンドモードにして、Move関数で取得された値を指定して描画しているだけです。All関数では単純にMove関数とDraw関数を呼び出しているだけです。このAll関数はCONTROLクラス内で呼び出しますが、エフェクトの初期位置の座標やフラグをセットするための関数が必要になります。flag;}SetFlag関数とGetFlag関数です。SetFlag関数は引数のx,y座標をそれぞれ代入し、flagをtrueにします。GetFlag関数は変数flagを返すだけです。次にCONTROLクラスのヘッダーファイルとコンストラクタです。fopen("enemydata.csv","r");//ヘッダ読み飛ばしwhile(fgetc(fp)!='\n');while(1){while(1){c=fgetc(fp);//末尾ならループを抜ける。char*)&c);//カンマか改行ならループ抜ける。elsebreak;}//ここに来たということは、1セル分の文字列が出来上がったということswitch(col){//1列目は敵種類を表す。atoi関数で数値として代入。ENEMY(data[i].type,data[i].stype,data[i].m_pattern,data[i].s_pattern,data[i].in_time,data[i].stop_time,data[i].shot_time,data[i].out_time,data[i].x,data[i].y,data[i].speed,data[i].hp,data[i].item);}//サウンドファイル読み込みs_eshot=LoadSoundMem("enemyshot.wav");s_pshot=LoadSoundMem("playershot.wav");s_edead=LoadSoundMem("enemydown.wav");s_pdead=LoadSoundMem("playerdown.wav");eshot_flag=false;pshot_flag=false;edead_flag=false;pdead_flag=false;}EFFECT_EDEADクラスのポインタを宣言し、コンストラクタの最初の方で、EFFECT_EDEADNUMの数だけインスタンスを生成しています。これはdefine.hで20と定義しています。画面内に現われるエフェクトは多くても20個ぐらいかなということでこの値にしてます。次にエフェクトのフラグをセットするために、SetFlag関数を呼び出すのですが、それ専用の関数もCONTROLクラス内に作ってしまいましょう。z=0;z<EFFECT_EDEADNUM;++z){if(!effect_edead[z]->GetFlag()){effect_edead[z]->SetFlag(x,y);break;}}}EnemyDeadEffect関数です。引数には敵のx,y座標を渡します。forループでエフェクトのインスタンス数分のループを行い、フラグが立っていないやつがあれば、SetFlag関数を実行しています。敵が消滅したときに呼び出すので、操作キャラの弾と敵との当たり判定部分で呼び出します。下の処理で呼び出しています。これでエフェクトのセットができるようになったので、あとはAll関数で、このエフェクトクラスのAll関数を呼び出すだけです。i=0;i<EFFECT_EDEADNUM;++i){if(effect_edead[i]->GetFlag()){effect_edead[i]->All();}}SoundAll();++g_count;}上記コードの「敵消滅エフェクト」と書かれた部分のコードがそうです。エフェクトのインスタンスの数だけループさせ、フラグが立っているもののみAll関数を実行してます。デストラクタのコードは省略しますが、newで動的確保しているのでdeleteするのを忘れないでください。敵消滅エフェクトを追加することで、以下の動画のようになります。今回の説明は以上です。次回はプレイヤー消滅エフェクトを追加しましょう。メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。TOPページのデザインを変更。相互リンクページに、複数サイト追加。C言語学習ページ発展編(1~9章)追加。HTML/CSSリファレンスのページ追加。