ページ 1 / 1
インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 10:52
by KEYONN_
毎度、お世話になっています。TKOZです。
Move_Interval(敵の移動間隔)というグローバル変数を敵の数が減少するごとに下げると、
敵がとんでもない動きをします。
その処理を行っている関数は、SpeedUp()関数です。
原因不明で、BorlandC++Compiler5.5でも、VisualC++でも全く同じ動きをします。
とりあえず、今は、VisualC++で動かしていますが、誰か原因が分かる方や、こうすれば
大丈夫のようなアドバイスください。よろしくお願いします。
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 11:28
by ねこ
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:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 12:39
by KEYONN_
>>ねこさん
>この処理、敵の数だけループしている中に記述したらまずいんでは?
>外にある必要があると思いますが
ズクズク音(敵が動く音)の再生処理の事でしょうか?
このままでも、動きますが、一応、ループの外で処理するようにしました。
他にもおかしい所がありましたら、よろしくお願いします。
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 12:50
by MNS
ねこさんが言っているのはtimerに対する加算処理のことでは?
この仕組みでは、毎ステップごとに敵の数だけtimerに加算されてしまいますが、
それは望まれることなのでしょうか?
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 13:08
by KEYONN_
>>MSNさん
>>ねこさん
timerでしたか…。全く気づきませんでした。
そうですね。良くソースコードを見ると、確かに敵の数だけ加算されてしまいますね。
timerをstatic int timer[5][11]={0};と宣言し直しました。
そうすると、上手く動きました。ありがとうございました。
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 15:38
by KEYONN_
先ほどはありがとうございました。
しかし、また悩んでいる問題があります。
壁敵敵敵
壁敵敵
壁敵 敵
移動方向←
とか、
敵敵敵壁
敵 敵壁
敵 壁
移動方向→
等の場合、
どうすれば、一回だけ全体をY方向に32足して、移動方向を変えるのですか?
現状のコードでは、うまくいかないです。
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 17:26
by バグ
移動させる前に、次に移動したら壁に重なる敵がいるかどうかを判定し1匹でも見つかったならば、移動量にマイナス1を掛ける…という方法で如何でしょうか?
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 19:33
by KEYONN_
>>バグさん
どうすれば、そのようなコードを書くことができるのか、
分かりません。
とりあえず、movex*=-1;としましたが、条件があいまいで、
if(Enemy[j].x<0 || Enemy[j].x>640-32)としました。
それ専用の関数でも作る必要がありそうでしたが、あまりメリットが
感じられなかったので、削除しました。
とりあえず、今日は、ここまでにしておきます。
Re:インベーダーゲームを作っているのですが…
Posted: 2009年9月20日(日) 22:28
by MNS
いまいちわかりかねるのですが、
敵一個体ではなく、敵全体の動きを反転させたい、ということでしょうか?
前提として、全ての敵は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:インベーダーゲームを作っているのですが…
Posted: 2009年9月21日(月) 13:29
by KEYONN_
MNSさんとこのスレッドのみなさんへ
ありがとうございました。
無事、インベーダーゲームは完成しました。
まだ、微調整が必要ですが、ほぼ完成となりました。
いろいろなご意見、アドバイスなど、とても参考になりました。
また、機会があれば、お話しましょう。それでは失礼します。