ページ 11

敵と弾が止まってしまいます。

Posted: 2009年8月16日(日) 21:07
by ひっさん
シューティングゲームの館のほうのプログラムをもとに、シューティングゲームを作る練習をしています。

ショットを撃っている敵を倒すと、その後も弾を撃ち続けてしまうのを直そうとしているのですが、うまくいきません。
正確には、弾を撃ち続けるのは直ったのですが、弾と敵が数秒間停止してしまうようになりました。
プレイヤーは動くこともショットを撃つこともできるので、処理が追いついていないわけではなさそうです。

コードを書くとぐちゃぐちゃになってしまうので、
http://hissantwokomi.hp.infoseek.co.jp/shoot.zip
にプロジェクトをアップしました。

コンパイラはVC++2008EEです。

ご指導お願いします。


追記:
作りかけのプレイヤーHPゲージが変な位置に表示されていたり、コンティニュー画面が未完成だったりしますが、そこは気にしないでください。
よろしくお願いします。

Re:敵と弾が止まってしまいます。

Posted: 2009年8月17日(月) 16:47
by pooka
例えばenemy_shot.cppのEnemyShotPattern2を見ると

if(enemy[EnemyShot.E_no].flag==0)
    break;

のようになっていますが、これを以下のようにしてみてください。

void EnemyShotPattern2(int i){
&#160;&#160;&#160;&#160;for(int&#160;j=0;j<10;j++){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(enemy[EnemyShot.E_no].flag==1){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(EnemyShot.counter==20*j){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot.EnemyShots[j].flag=1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot.EnemyShots[0].angle&#160;=&#160;atan2(EnemyShot.mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;StopSoundMem(sound_enemy_shot[0]);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[0].angle);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[0].angle);
&#160;&#160;&#160;&#160;}
}

これで止まらないようになると思います。
EnemyShotPattern3以降も変更してみてください。

Re:敵と弾が止まってしまいます。

Posted: 2009年8月17日(月) 21:18
by ひっさん
回答ありがとうございます。大分解決しました。
if(enemy[EnemyShot.E_no].flag==0) 
    break;

の部分を全て
if(enemy[EnemyShot.E_no].flag==1){

}

に変えました。

一時停止してしまうことはなくなりました。

しかし、新たに問題が発生しました。
一時停止することはなくなりましたが、パターン9(乱数ショット)の代わりに数秒間をおいて(もう敵はいないのに)再び弾を撃ちだしてしまうようになりました。

http://hissantwokomi.hp.infoseek.co.jp/shoot.zip
にプロジェクトをアップしなおしましたので、よろしくお願いします。

Re:敵と弾が止まってしまいます。

Posted: 2009年8月17日(月) 23:50
by pooka
EnemyShot.counterを利用することで解決できるかもしれません。(220という値は適宜変更してください)

void EnemyShotPattern9(int i){
if(enemy[EnemyShot.E_no].flag==1 && EnemyShot.counter <220){
for(int j=0;j<120;j++){
if(EnemyShot.counter==2*j){
EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;
EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;
EnemyShot.EnemyShots[j].flag=1;
EnemyShot.EnemyShots[j].angle = atan2(Player.y-EnemyShot[i].mem_ey,Player.x-EnemyShot[i].mem_ex)+(double)GetRand(1500)/1000.0f-0.75f;
StopSoundMem(sound_enemy_shot[0]);
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
}
}
}
for(int j=0;j<200;j++){
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle);
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle);
}
}

Re:敵と弾が止まってしまいます。

Posted: 2009年8月18日(火) 20:45
by ひっさん
EnemyShot.counterを使ってもまだ完全には直らなかったのでいろいろいじくってみたところ、わかったことがありました。
消えた敵が弾を撃ちだしてしまうのは次の敵が出てきた瞬間からだ、ということです。
敵の出現タイミングをいじるとどのパターンでも同じ現象が発生しましたので、間違いありません。
原因は、次の敵が出てくるときに変数iが書き換えられていたことだったようです。

どうも根本からひっくり返ってしまったので、シューティングゲームの館をもとに自分で考えるのは一旦あきらめて、龍神録プログラミングの館を見て勉強しなおそうと思います。


ここまでご指導いただき、ありがとうございました。