シューティングゲーム作成入門トップに戻るアイテムを出現させよう今回はアイテムを出現させてみましょう。画像については以下のものを使います。一つ目と三つ目、二つ目と四つ目の画像を組み合わせて描画します。一つ目と二つ目の描画は回転させながら描画することにします。Pと書いてあるのはパワーアップ形のアイテムで、Sと書いてあるのは得点アップ系のアイテムにします。次にITEMクラスを作成します。LoadGraph("items2.png");}x=y=0;rad=0;count=0;fall_flag=false;flag=false;}変数については書いてあるとおりです。コンストラクタで画像の読み込みや変数の初期値の設定を行います。グラフィックハンドルについては、static指定子をつけているので、インスタンス内で共有されます。値が0の時、つまり初回だけ読み込むようにします。次にアイテムの動きの部分のコードです。最初勢いよく上に飛び出して、以降はゆっくり落下していく感じの動作にさせます。その動作を担っているMove関数のコードです。tempy;//0.04ラジアン(約2度)ずつ回転させる。tempy;}else{//落下時は一定速度で落下y+=1.5;}//画面の外にはみ出たらフラグを戻す。徐々に増加していくラジアンの値が必要になります。変数radには0.04(約二度)×countの値を代入することで、1ループごとに約2度ずつ増加させながら値を代入することができます。これで回転はOKです。次にif文がありますが、fall_flagによって分岐しています。fall_flagというのは、アイテムが勢いよく飛び出して、落下し始めると立つフラグです。立っていないときは、アイテムを上昇させるコードを書いています。ここの原理は、ゲームプログラミング「キャラをジャンプさせよう」の応用です。上記のリンクを見ていただくと分かりますが、ジャンプをして一番上まで到達した瞬間に、(y-prev_y)+1の値は0になります。この瞬間にフラグを戻してやればよいということになります。これでアイテムを飛び出させるコードは書けました。次は落下する部分(else文)の方のコードです。落下時は単純に一定速度で下げていくだけなので、Y座標を単純に増加させているだけです。(Y座標は下がプラスなので足してます)最後にアイテムが画面からはみ出たらフラグを戻す必要があります。X座標方向にアイテムが移動するようにはしていないので、Y座標だけで判定しています。Yが500の座標を超えるとほぼはみ出したと判断できるので、その時にDelete関数を実行しています。Delete関数は以下のようになっています。ITEM::Delete(){count=0;fall_flag=false;flag=false;}単純にカウント、落下フラグ、出現中のフラグを元に戻しているだけです。ここまででアイテムの移動部分のコードについては書けました。次に描画部分のコードです。ITEM::Draw(){DrawRotaGraph(x,y,1.0,rad,gh[type],TRUE);DrawRotaGraph(x,y,1.0,0,ghs[type],TRUE);}一つ目のDrawRotaGraphはギザギザの円盤の描画です。取得した座標と回転角度のradを渡しています。グラフィックハンドルについては、添え字に変数typeを使っています。これはアイテムの種類を表す値が入っています。後で説明しますが、SetFlag関数というもので座標やアイテムの種類を設定するのですが、その時に設定されるものです。アイテムは2種類しかないので今のところ0か1の値が入っています。0が得点系、1がパワーアップ系のアイテムを表します。画像を読み込むときに、この値に対応する順番で読み込んでいるので、そのままtypeの値を指定するだけで、目的の画像が描画できるようになっています。二つ目のDrawRotaGraphは、SとかPとかの文字のことです。これは単純に描画するだけなので、回転もさせずにただそのまま描画しています。辺り判定部分のコードを説明する前に、このアイテムクラスの座標を設定したり、取得したりする部分の関数のコードを貼っておきます。ITEM::All(){Move();Draw();}最初のSetFlag関数ですが、引数に指定された座標や、アイテムの種類を示すtypeなどの代入を行っています。y座標をマイナス8しているのは、ジャンプの説明のリンクにもあるとおり、ジャンプするように勢いよく飛び出させるには、初回だけ少し大きめの値を引いておく必要があります。そのために8を引いてるだけです。それ以外の関数については、座標、フラグ、アイテムの種類を取得したり、セットしたりする関数です。当たり判定部分のコードを書く前に、以下の定数を先にdefine.hで定義しておきます。30単純にアイテムの当たり判定用の半径と、アイテムクラスの総数です。30としているのは、一画面中に最大でも30個ぐらいまでしか表示しないだろうという予測から30としているだけです。再生部分のコードを新たに追加しています。文字と数値を描画するようにコードを追加しています。この辺は特にコードは一緒で中身だけ変えただけなので説明は省略します。当たり判定部分のコードを見てみましょう。1:score->SetScore(POWER_SCORE,1);break;}item[i]->Delete();//アイテム取得音をセットitem_flag=true;}}}}//ライフは毎回取得score->SetScore(LIFE_SCORE,player->GetLife());}かなり縦に長くなってしまいましたが、まず、敵とプレイヤーの弾の当たり判定部分の一番下の部分を見てください。見つかれば、SetFlag関数を使って、座標やアイテムの種類をセットしてます。アイテムの出現に関してはこれでOKです。次に、一番下の方にある、アイテムとプレイヤーの当たり判定の部分を見てください。上にある、プレイヤーが生きているときだけ実行するというif文に囲まれています。プレイヤーが生きているときしか実行されないということを頭に置いといてください。最初のforループでアイテムの数だけループさせています。フラグを取得し、フラグが立っている、つまりアイテムが出現中だった場合、その座標を取得しています。その後円形の当たり判定用の関数にプレイヤーとアイテムの座標等を渡し、当たり判定を実行しています。当たっていたら、アイテムの種類によってswitch文で処理を分岐させ、スコアを設定しています。種類が1、つまりパワーアップ系のアイテムであれば、パワーを1増加させています。最後に、アイテムを取得したらアイテムを消す必要があるので、Delete関数を実行しフラグを戻しています。あとは、All関数でITEMクラスのインスタンスでフラグが立っているものだけ、All関数を実行させます。i=0;i<ITEM_NUM;++i){if(item[i]->GetFlag()){item[i]->All();}}//描画領域を指定SetDrawArea(0,0,640,480);//スコア描画score->All();SoundAll();++g_count;}こうすることで、以下の動画のようにアイテムを出現させることができます。ゲームっぽくなると思います。今回はその辺は省略します。今回の説明は以上です。次回は、プレイヤーのショットをパワーアップさせてみましょう。メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。TOPページのデザインを変更。相互リンクページに、複数サイト追加。C言語学習ページ発展編(1~9章)追加。HTML/CSSリファレンスのページ追加。