インベーダーゲームを作っているのですが…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KEYONN_

インベーダーゲームを作っているのですが…

#1

投稿記事 by KEYONN_ » 16年前

毎度、お世話になっています。TKOZです。
Move_Interval(敵の移動間隔)というグローバル変数を敵の数が減少するごとに下げると、
敵がとんでもない動きをします。
その処理を行っている関数は、SpeedUp()関数です。
原因不明で、BorlandC++Compiler5.5でも、VisualC++でも全く同じ動きをします。
とりあえず、今は、VisualC++で動かしていますが、誰か原因が分かる方や、こうすれば
大丈夫のようなアドバイスください。よろしくお願いします。

ねこ

Re:インベーダーゲームを作っているのですが…

#2

投稿記事 by ねこ » 16年前

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 ) ;
        //ズクズク音を再生する
    }
}

この処理、敵の数だけループしている中に記述したらまずいんでは?
外にある必要があると思いますが

KEYONN_

Re:インベーダーゲームを作っているのですが…

#3

投稿記事 by KEYONN_ » 16年前

>>ねこさん
>この処理、敵の数だけループしている中に記述したらまずいんでは?
>外にある必要があると思いますが

ズクズク音(敵が動く音)の再生処理の事でしょうか?
このままでも、動きますが、一応、ループの外で処理するようにしました。
他にもおかしい所がありましたら、よろしくお願いします。

MNS

Re:インベーダーゲームを作っているのですが…

#4

投稿記事 by MNS » 16年前

ねこさんが言っているのはtimerに対する加算処理のことでは?
この仕組みでは、毎ステップごとに敵の数だけtimerに加算されてしまいますが、
それは望まれることなのでしょうか?

KEYONN_

Re:インベーダーゲームを作っているのですが…

#5

投稿記事 by KEYONN_ » 16年前

>>MSNさん
>>ねこさん
timerでしたか…。全く気づきませんでした。
そうですね。良くソースコードを見ると、確かに敵の数だけ加算されてしまいますね。
timerをstatic int timer[5][11]={0};と宣言し直しました。
そうすると、上手く動きました。ありがとうございました。

KEYONN_

Re:インベーダーゲームを作っているのですが…

#6

投稿記事 by KEYONN_ » 16年前

先ほどはありがとうございました。
しかし、また悩んでいる問題があります。
壁敵敵敵
壁敵敵
壁敵 敵
移動方向←

とか、
敵敵敵壁
敵 敵壁
 敵 壁
移動方向→

等の場合、
どうすれば、一回だけ全体をY方向に32足して、移動方向を変えるのですか?

現状のコードでは、うまくいかないです。

バグ

Re:インベーダーゲームを作っているのですが…

#7

投稿記事 by バグ » 16年前

移動させる前に、次に移動したら壁に重なる敵がいるかどうかを判定し1匹でも見つかったならば、移動量にマイナス1を掛ける…という方法で如何でしょうか?

KEYONN_

Re:インベーダーゲームを作っているのですが…

#8

投稿記事 by KEYONN_ » 16年前

>>バグさん
どうすれば、そのようなコードを書くことができるのか、
分かりません。

とりあえず、movex*=-1;としましたが、条件があいまいで、
if(Enemy[j].x<0 || Enemy[j].x>640-32)としました。
それ専用の関数でも作る必要がありそうでしたが、あまりメリットが
感じられなかったので、削除しました。

とりあえず、今日は、ここまでにしておきます。

MNS

Re:インベーダーゲームを作っているのですが…

#9

投稿記事 by MNS » 16年前

いまいちわかりかねるのですが、
敵一個体ではなく、敵全体の動きを反転させたい、ということでしょうか?

前提として、全ての敵は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;
		}
	}
}


この擬似コードを、あなた自身のプログラムに使えるようアレンジしてみてください。

KEYONN_

Re:インベーダーゲームを作っているのですが…

#10

投稿記事 by KEYONN_ » 16年前

MNSさんとこのスレッドのみなさんへ

ありがとうございました。
無事、インベーダーゲームは完成しました。
まだ、微調整が必要ですが、ほぼ完成となりました。

いろいろなご意見、アドバイスなど、とても参考になりました。

また、機会があれば、お話しましょう。それでは失礼します。

閉鎖

“C言語何でも質問掲示板” へ戻る