こんにちは。私はDXライブラリを使ってゲーム制作をしている短大生です。
貴サイトの「シューティングゲームの館」を参考にして進めてきました。記載されている部分までは終わったので自分で色々プログラムを組んで行こうと思ったのですが、敵の体力を設定しようとするところでつまづいてしまいました。現在考えているのは、hpという変数をとり、自機の弾を当てるたびにhpの値を増やしていき、それがhp=5になったら敵のフラグを消す、というプログラムですが、うまくいきません。
プログラムが見づらいかもしれませんが、是非ご教授お願いします。
void CollisionDetection(){
int s=0;
enemy.hp=0;
for(int i=0;i<PLAYER_MAX_SHOT1;i++){ //ショットの全列分
for(int j=0;j<PLAYER_MAX_SHOT2;j++){ //1列全弾分
if(PlayerShot[j].flag==1){ //その弾が発射中なら
for(s=0;s<ENEMY_TOTAL_NUM;s++){ //全敵100体分
if(enemy.flag==1){ //その敵が出現中なら
double x,y;
int range;
x=(int)(PlayerShot[j].x-enemy.x);
y=(int)(PlayerShot[j].y-enemy.y);
switch(i){
case 0: //0列目と
case 5: //5列目と
case 6: //6列目の
range=12; //大きさは半径12
break;
default:
range=9; //大きさは半径9
break;
}
//当たり判定。敵の体力設定
if((int)sqrt(x*x+y*y) < range+enemy.range){ //当たり判定内なら
PlayerShot[j].flag=0;
enemy.hp++;
if(enemy.hp==5){
enemy.flag=0; //表示フラグを戻す
PlayerShot[j].flag=0; //当たった弾を消す
if(CheckSoundMem(sound_enemy_death)==1){ //消滅音が鳴っていなかったら
StopSoundMem(sound_enemy_death); //とめて
}
PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK); //消滅音を鳴らす
}
}
}
}
}
}
}
}
敵の体力について
Re:敵の体力について
これ、コンパイル通ってます?
とりあえず、関数の頭の変数の宣言と初期化が微妙ですし、
ローカルのx,yの宣言位置おかしくないでしょうか?
当たり判定等のデバッグ時は、各オブジェクトの座標位置等の情報や、
当たった時は"当たった"って画面に表示して見るとデバッグし易いですよ。
とりあえず、関数の頭の変数の宣言と初期化が微妙ですし、
ローカルのx,yの宣言位置おかしくないでしょうか?
当たり判定等のデバッグ時は、各オブジェクトの座標位置等の情報や、
当たった時は"当たった"って画面に表示して見るとデバッグし易いですよ。
Re:敵の体力について
> とりあえず、関数の頭の変数の宣言と初期化が微妙ですし、
enemy[/url]を、外部変数として正しく定義してあれば、問題ありません。
> ローカルのx,yの宣言位置おかしくないでしょうか?
当該のif文が構成するブロックの中だけで有効な変数定義として、正しい方法です。
>パソピさんへ
コードを載せるときは、前後を<pre>タグと</pre>タグ(<>は半角)で
はさんでください。
全角空白を使うと、見た目はインデントしていますが、
見ている人たちの環境でコンパイルするときに、
全角空白をタブや半角空白に置き換える手間がかかります。
enemy[/url]を、外部変数として正しく定義してあれば、問題ありません。
> ローカルのx,yの宣言位置おかしくないでしょうか?
当該のif文が構成するブロックの中だけで有効な変数定義として、正しい方法です。
>パソピさんへ
コードを載せるときは、前後を<pre>タグと</pre>タグ(<>は半角)で
はさんでください。
全角空白を使うと、見た目はインデントしていますが、
見ている人たちの環境でコンパイルするときに、
全角空白をタブや半角空白に置き換える手間がかかります。
Re:敵の体力について
弾の当たり判定のたびにこの関数を通るんですよね?
だとすると、関数の最初で
enemy.hp=0;
してるからじゃないですか?
これだといつまでたってもhp=5にはならないと思います。
だとすると、関数の最初で
enemy.hp=0;
してるからじゃないですか?
これだといつまでたってもhp=5にはならないと思います。
Re:敵の体力について
みなさん、お疲れ様です。
パソピさんの提示されたコードはほぼシューティングの館の19の当たり判定のまんまなわけで・・・
>double x,y;
>int range;
も管理人さんのコードのままなわけで・・・回答者たちの知識を試すミスリードかと思いましたよ。
(自分もあの位置での宣言っていいの?って指摘する寸前でした(^^; )
で、結果的に何が悪いかと言うとMistさんも指摘している通り、
この当たり判定関数に飛んできたときに、敵の体力(というか被弾回数?)を0クリアしてしまっているからですね。
敵の体力を変数で管理する。→宣言しなきゃ→初期値入れなきゃ
という本来ならば正しい行動が裏目に出てしまった結果ではないでしょうか。
パソピさんの提示されたコードはほぼシューティングの館の19の当たり判定のまんまなわけで・・・
>double x,y;
>int range;
も管理人さんのコードのままなわけで・・・回答者たちの知識を試すミスリードかと思いましたよ。
(自分もあの位置での宣言っていいの?って指摘する寸前でした(^^; )
で、結果的に何が悪いかと言うとMistさんも指摘している通り、
この当たり判定関数に飛んできたときに、敵の体力(というか被弾回数?)を0クリアしてしまっているからですね。
敵の体力を変数で管理する。→宣言しなきゃ→初期値入れなきゃ
という本来ならば正しい行動が裏目に出てしまった結果ではないでしょうか。
Re:敵の体力について
あれ?
下の当たり判定のsqrtの部分のx,yって有効ですっけ?
って思っての指摘だったのですが、よく見たら同ブロック内でしたね。
普段tab大き目の数字にしてる弊害が・・・orz
switchで切れてるみたいに見えたので(確認甘くてすいません)。
あと、初期化が微妙なのは配列なのに先頭要素(s=0)しか初期化していない点を指摘したつもりだったのですが。
残りの99体はどうなってるんでしょう?
下の当たり判定のsqrtの部分のx,yって有効ですっけ?
って思っての指摘だったのですが、よく見たら同ブロック内でしたね。
普段tab大き目の数字にしてる弊害が・・・orz
switchで切れてるみたいに見えたので(確認甘くてすいません)。
あと、初期化が微妙なのは配列なのに先頭要素(s=0)しか初期化していない点を指摘したつもりだったのですが。
残りの99体はどうなってるんでしょう?
Re:敵の体力について
レスが遅れて申し訳ありません。
皆さん回答ありがとうございます。Mistさんの言うとおり宣言の位置がおかしいですね…自分で変数毎回0にしていたら敵不死身になりますね…
コードを修正したいと思います。
初心者的な質問で色々混乱させてしまってすみませんでしたm(_ _)m
また、タグを使わず見づらいコードにしてしまったこともお詫びします。
皆さんありがとうございました。
皆さん回答ありがとうございます。Mistさんの言うとおり宣言の位置がおかしいですね…自分で変数毎回0にしていたら敵不死身になりますね…
コードを修正したいと思います。
初心者的な質問で色々混乱させてしまってすみませんでしたm(_ _)m
また、タグを使わず見づらいコードにしてしまったこともお詫びします。
皆さんありがとうございました。
Re:敵の体力について
非効率プログラムのため、本当にいろんな方の混乱招いているようで申し訳ない限りです・・・。
勝手にHP作るのはいいけど、人に迷惑かけるなと・・(汗
HPの設定は減算の方がいいのではないでしょうか。
というのも、enemy.hp>0の時存在している・・というプログラムの方が書きやすくないでしょうか?
敵にはいろんな体力があるでしょう。
5の敵、10の敵、15の敵・・・
aの敵は5以上になったら死んで、bの敵は10以上になったら死んで・・
とするより、0になったら全部死ぬというほうがアルゴリズムとしては簡単ではないでしょうか。
その代わり登録時には、個別に設定が必要ですが。
・・まぁどちらでもいいのですが(汗
勝手にHP作るのはいいけど、人に迷惑かけるなと・・(汗
HPの設定は減算の方がいいのではないでしょうか。
というのも、enemy.hp>0の時存在している・・というプログラムの方が書きやすくないでしょうか?
敵にはいろんな体力があるでしょう。
5の敵、10の敵、15の敵・・・
aの敵は5以上になったら死んで、bの敵は10以上になったら死んで・・
とするより、0になったら全部死ぬというほうがアルゴリズムとしては簡単ではないでしょうか。
その代わり登録時には、個別に設定が必要ですが。
・・まぁどちらでもいいのですが(汗
Re:敵の体力について
管理人さん回答ありがとうございます。
私のC言語に対する知識が不足しているため、私が勝手に混乱しているだけです^^;
HPの設定には減算方式をとります。
また質問をするときがあると思いますが、そのときはみなさんよろしくお願いします。
私のC言語に対する知識が不足しているため、私が勝手に混乱しているだけです^^;
HPの設定には減算方式をとります。
また質問をするときがあると思いますが、そのときはみなさんよろしくお願いします。