毎度、お世話になっています。TKOZです。
Move_Interval(敵の移動間隔)というグローバル変数を敵の数が減少するごとに下げると、
敵がとんでもない動きをします。
その処理を行っている関数は、SpeedUp()関数です。
原因不明で、BorlandC++Compiler5.5でも、VisualC++でも全く同じ動きをします。
とりあえず、今は、VisualC++で動かしていますが、誰か原因が分かる方や、こうすれば
大丈夫のようなアドバイスください。よろしくお願いします。
インベーダーゲームを作っているのですが…
Re:インベーダーゲームを作っているのですが…
timer++; if(timer>Move_Interval) { timer=0; Enemy[j].x+=Enemy[j].movex; static int count=0; count++; if(count>Move_Interval*2) { count=0; PlaySoundMem(SoundHandle[3] , DX_PLAYTYPE_BACK ) ; //ズクズク音を再生する } }
この処理、敵の数だけループしている中に記述したらまずいんでは?
外にある必要があると思いますが
Re:インベーダーゲームを作っているのですが…
>>ねこさん
>この処理、敵の数だけループしている中に記述したらまずいんでは?
>外にある必要があると思いますが
ズクズク音(敵が動く音)の再生処理の事でしょうか?
このままでも、動きますが、一応、ループの外で処理するようにしました。
他にもおかしい所がありましたら、よろしくお願いします。
>この処理、敵の数だけループしている中に記述したらまずいんでは?
>外にある必要があると思いますが
ズクズク音(敵が動く音)の再生処理の事でしょうか?
このままでも、動きますが、一応、ループの外で処理するようにしました。
他にもおかしい所がありましたら、よろしくお願いします。
Re:インベーダーゲームを作っているのですが…
ねこさんが言っているのはtimerに対する加算処理のことでは?
この仕組みでは、毎ステップごとに敵の数だけtimerに加算されてしまいますが、
それは望まれることなのでしょうか?
この仕組みでは、毎ステップごとに敵の数だけtimerに加算されてしまいますが、
それは望まれることなのでしょうか?
Re:インベーダーゲームを作っているのですが…
>>MSNさん
>>ねこさん
timerでしたか…。全く気づきませんでした。
そうですね。良くソースコードを見ると、確かに敵の数だけ加算されてしまいますね。
timerをstatic int timer[5][11]={0};と宣言し直しました。
そうすると、上手く動きました。ありがとうございました。
>>ねこさん
timerでしたか…。全く気づきませんでした。
そうですね。良くソースコードを見ると、確かに敵の数だけ加算されてしまいますね。
timerをstatic int timer[5][11]={0};と宣言し直しました。
そうすると、上手く動きました。ありがとうございました。
Re:インベーダーゲームを作っているのですが…
先ほどはありがとうございました。
しかし、また悩んでいる問題があります。
しかし、また悩んでいる問題があります。
壁敵敵敵 壁敵敵 壁敵 敵 移動方向← とか、 敵敵敵壁 敵 敵壁 敵 壁 移動方向→ 等の場合、 どうすれば、一回だけ全体をY方向に32足して、移動方向を変えるのですか? 現状のコードでは、うまくいかないです。
Re:インベーダーゲームを作っているのですが…
移動させる前に、次に移動したら壁に重なる敵がいるかどうかを判定し1匹でも見つかったならば、移動量にマイナス1を掛ける…という方法で如何でしょうか?
Re:インベーダーゲームを作っているのですが…
>>バグさん
どうすれば、そのようなコードを書くことができるのか、
分かりません。
とりあえず、movex*=-1;としましたが、条件があいまいで、
if(Enemy[j].x<0 || Enemy[j].x>640-32)としました。
それ専用の関数でも作る必要がありそうでしたが、あまりメリットが
感じられなかったので、削除しました。
とりあえず、今日は、ここまでにしておきます。
どうすれば、そのようなコードを書くことができるのか、
分かりません。
とりあえず、movex*=-1;としましたが、条件があいまいで、
if(Enemy[j].x<0 || Enemy[j].x>640-32)としました。
それ専用の関数でも作る必要がありそうでしたが、あまりメリットが
感じられなかったので、削除しました。
とりあえず、今日は、ここまでにしておきます。
Re:インベーダーゲームを作っているのですが…
いまいちわかりかねるのですが、
敵一個体ではなく、敵全体の動きを反転させたい、ということでしょうか?
前提として、全ての敵はmovexを敵のx座標に加算させることによって動いている、という認識のもとで話を進めます。
間違っている場合は以下の話は全く的外れな回答となりますので、参考にしないでください。
movexが正の場合、全ての敵で最も右に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が大きいものの座標を何かに記憶させればよいです。
そして、その座標が(640-敵の大きさ)の以上かどうかを調べます。
もし、それが真であった場合、movexの値を負にし、全ての敵のy座標に対し32をプラスします。
moveyが負の場合、全ての敵で最も左に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が小さいものの座標を何かに記憶させればよいです。
そして、その座標が0以下かどうかを調べます。
もし、それが真であった場合、movexの値を正にし、全ての敵のy座標に対し32をプラスします。
実際の擬似コードは以下のようなものになります。
この擬似コードを、あなた自身のプログラムに使えるようアレンジしてみてください。
敵一個体ではなく、敵全体の動きを反転させたい、ということでしょうか?
前提として、全ての敵はmovexを敵のx座標に加算させることによって動いている、という認識のもとで話を進めます。
間違っている場合は以下の話は全く的外れな回答となりますので、参考にしないでください。
movexが正の場合、全ての敵で最も右に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が大きいものの座標を何かに記憶させればよいです。
そして、その座標が(640-敵の大きさ)の以上かどうかを調べます。
もし、それが真であった場合、movexの値を負にし、全ての敵のy座標に対し32をプラスします。
moveyが負の場合、全ての敵で最も左に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が小さいものの座標を何かに記憶させればよいです。
そして、その座標が0以下かどうかを調べます。
もし、それが真であった場合、movexの値を正にし、全ての敵のy座標に対し32をプラスします。
実際の擬似コードは以下のようなものになります。
if(movex > 0) { int maximum_x = -65535; for(int i = 0; i < 敵の最大数; ++i) { if(敵.x > maximum_x) { maximum_x = 敵.x; } } //敵の大きさが均一でない場合は、 //最も右にいる敵の大きさも記憶する必要があります if(maximum_x >= (640 - 敵の大きさ)) { movex *= -1; for(int i = 0; i < 敵の最大数; ++i) { 敵.y += 32; } } } else { int minimum_x = 65535; for(int i = 0; i < 敵の最大数; ++i) { if(敵.x < minimum_x) { minimum_x = 敵.x; } } //敵の大きさが均一でない場合は、 //最も右にいる敵の大きさも記憶する必要があります if(minimum_x <= 0) { movex *= -1; for(int i = 0; i < 敵の最大数; ++i) { 敵.y += 32; } } }
この擬似コードを、あなた自身のプログラムに使えるようアレンジしてみてください。
Re:インベーダーゲームを作っているのですが…
MNSさんとこのスレッドのみなさんへ
ありがとうございました。
無事、インベーダーゲームは完成しました。
まだ、微調整が必要ですが、ほぼ完成となりました。
いろいろなご意見、アドバイスなど、とても参考になりました。
また、機会があれば、お話しましょう。それでは失礼します。
ありがとうございました。
無事、インベーダーゲームは完成しました。
まだ、微調整が必要ですが、ほぼ完成となりました。
いろいろなご意見、アドバイスなど、とても参考になりました。
また、機会があれば、お話しましょう。それでは失礼します。