忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

自機弾と敵との当たり判定を追加しました。
s-WS000355.jpg
敵の体力の概念を導入して、自機弾と当たっている時は
SetDrawBlendMode( DX_BLENDMODE_ADD , 255 )と言う感じで光ってるようにしてみました。
このプログラムのプロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1239650332

複数対複数の当たり判定の場合はコチラで書いていますが、ちょっとややこしいです。
例えば画面上に自機弾が3発、敵が3機いたとします。
すると判定する要素は
自機弾1
自機弾2
自機弾3
敵1
敵2
敵3
の6つの要素となります。
この全ての要素の当たり判定を行う為には、自機弾1と敵全部、自機弾2と敵全部、自機弾3と敵全部の
当たり判定を行う必要があると言う事です。
プログラムで考えると2重にループさせて判定するとわかりやすいと思います。
敵=3;
自機弾=3;
for(i=0;i<敵;i++){
for(k=0;k<自機弾;k++){
~当たり判定処理~
}
}
こんな感じで判定しています。実際には画面上に出現する要素数は変動するので
配列変数を使って、画面にある要素だけを判定するようにしています。
関数としてはこんな感じ↓
////////////////////////////自機弾と敵の当たり判定////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void hantei_jikitama_teki(){
 int j;
 int i;
 int atari=0;
 int Cr;
 Cr = GetColor(   255 , 0 , 0 ) ; // 色を取得

for(i=0;i<ENEMY;i++){//敵の数だけ繰り返す
 if(enemy[i].ef==0) continue;
  if(enemy[i].ef==1) {
   for(j=0;j<JIKITAMA;j++){//自機弾の数だけ繰り返す
    if(jikitama[j].tf==0) continue;
    if(jikitama[j].tf==1) {
     if( jikitama[j].tx+JIKI_TAMA_ATARIHANTEI<(enemy[i].ex+enemy[i].e_sizex)-ENEMY_ATARIHANTEI && enemy[i].ex+ENEMY_ATARIHANTEI<(jikitama[j].tx+jikitama[j].sx)-JIKI_TAMA_ATARIHANTEI && jikitama[j].ty+JIKI_TAMA_ATARIHANTEI<(enemy[i].ey+enemy[i].e_sizey)-ENEMY_ATARIHANTEI && enemy[i].ey+ENEMY_ATARIHANTEI<(jikitama[j].ty+jikitama[j].sy)-JIKI_TAMA_ATARIHANTEI) atari=1;else atari=0;

   if( atari==1 ) {//当たったとき
    SetDrawBlendMode( DX_BLENDMODE_ADD , 255 );
    DrawGraph( enemy[i].ex , enemy[i].ey , g_teki01image[enemy[i].img] , TRUE  ) ;//敵表示
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
   enemy[i].e_life--;
   jikitama[j].tf=0;//自機弾消去
   }
   }
   } 
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
自機弾と敵が当たった時は自機弾を消去して敵の体力を減らしています。
で、敵の移動処理の部分に  
if(enemy[i].e_life<=0) {
   enemy[i].ef=0;//敵消去
   g_sc=g_sc+100;//得点プラス
  }
こんな感じで、体力が0以下になったら敵を消去して、得点を100プラスするようにしてみました。
そして、とりあえず左上にスコア表示もさせてみた。
普通に表示させると、得点が0の時は0としか表示されませんが、↓こんな感じで%08dと書けば
8桁表示”00000000”と表示されます。
DrawFormatString(60,30,color_white,"%08d",g_sc);
08の部分を02にすれば2桁、05とすれば5桁表示になります。
本当は画像で数字を表示させたいのですが、表示方法は勉強中です^^;

PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Twitter
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]