アクションゲーム

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

アクションゲーム

#1

投稿記事 by 初心者 » 16年前

こないだお世話になった初心者です。
僕は今、アクションゲームを作っています。
それで、自キャラにライフを作りたいと思って、以下の文を書きました。
struct Enemy{
     int life;			//生命力
     int temp1;			//自由に使える変数
//判定用変数
     int hantei;			//自由に使える変数
};
const int HANTEI = 3000;		//敵と自キャラの判定間隔
int jiki_life;			//前の自キャラ生命力	
//敵と自キャラの当たり判定
Ball2D m = { g_jikipos, 18 };
g_jiki_life = 2;
while(ProcessMessage == 0 && g_jiki_life > jiki_life){
      if ( g_enemies.hantei < (GetNowCount() + HANTEI) ){
         if (HitTestBallAndBall( b, m ) == TRUE ){
                   g_jiki_life--;
         }
      }
}
	if (g_jiki_life == 0){
		return TRUE;
	}

ですが、当たり判定がなくなったり、1回当たったらすぐゲームオーバーになってしまいます。
なぜそうなるか、どこが間違っているかを教えてください。

通りすがり

Re:アクションゲーム

#2

投稿記事 by 通りすがり » 16年前

各関数の内容もわからないし、どういうゲームの仕様かもわからないし、どこを省略してるのかもさっぱりわかりません。

そもそもコンパイルすら出来ません。

Mist

Re:アクションゲーム

#3

投稿記事 by Mist » 16年前

ソースが断片的すぎるので予想になりますが、g_enemies.hanteiの更新タイミングがまずいとそんな動きになりそな気はしますが。

Mikan

Re:アクションゲーム

#4

投稿記事 by Mikan » 16年前

>当たり判定がなくなったり、1回当たったらすぐゲームオーバーになってしまいます。
推測ですが、当り判定を行った後、再度当り判定をしてしまい、
g_jiki_lifeが0以下になってしまって

if (g_jiki_life == 0)

の条件に当てはまらないので当り判定がなくなったようにみえるのではないでしょうか?

また、1回でゲームオーバーになるのも何回も当り判定入ってしまい1回の判定で0になっているのでは?
と思います。

たとえばシューティングゲームで敵がプレイヤーのショットに当たった場合
敵の体力を1マイナスして、再度判定しないようにプレイヤーのショットを消してしたりします。

推測なので参考までに^^

初心者

Re:アクションゲーム

#5

投稿記事 by 初心者 » 16年前

通りすがりさん、Mistさん、コードが荒くてすいません。
関数は、DXライブラリーを使用しています。
コードは、当たり判定の部分です。
Mikanさん、推測ありがとうございます。
while(ProcessMessage == 0 && g_jiki_life > jiki_life){  
の部分がいらないということでしょうか?
きずいたことがあればご教授お願いします。

Mikan

Re:アクションゲーム

#6

投稿記事 by Mikan » 16年前

>きずいたことがあればご教授お願いします。
ソースファイルが全部見せていただけるのなら特定できるかと思います。
それとどんなゲームにしたいか考えてることを教えてください^^

ゲームを作ってると沢山難題に出会うでしょうけど、質問したり考えたりしながら
がんばってください^^

初心者

Re:アクションゲーム

#7

投稿記事 by 初心者 » 16年前

これがゲーム本体の処理です。最初に意味のわからないインクルード文が書いてありますが、とばしてください。CollisionCharacter関数が、当たり判定の関数です。敵の弾と自キャラの当たり判定で、自力でライフを作ることが出来ましたが、敵と自キャラの場合がうまくいきません。
ご教授お願いします。

Mikan

Re:アクションゲーム

#8

投稿記事 by Mikan » 16年前

CollisionCharacter関数の最初に 
if (g_enemies.used == TRUE){
	Ball2D b = { {g_enemies.position.x, g_enemies.position.y},
					  g_enemies.hankei
	};


ところで敵が使われているかどうかの判定をして衝突判定にはいっているようですが、
このままだと、g_enemies.used == FALSEの時にも判定に入ってしまい
前回のBall2D bの値で判定がおこなわれているのでは?とおもいました。

g_enemies.used == FALSEの時は衝突判定をしないのが良いのではないでしょうか?

それで一度試してみてください。

初心者

Re:アクションゲーム

#9

投稿記事 by 初心者 » 16年前

if (g_enemies.used == TRUE){
の下に
if (g_enemies.used == FALSE) break;
という物を入れてみましたが、ダメでした。

Mikan

Re:アクションゲーム

#10

投稿記事 by Mikan » 16年前

すみません、ネスト見間違えていました^^;
もう一度調べてみますね^^;

Mikan

Re:アクションゲーム

#11

投稿記事 by Mikan » 16年前

ソースファイルとにらめっこしているんですが、色々試せないのですこし混乱気味ですw
なので、参考程度にみてください。

//敵の弾と自キャラの当たり判定
のところで、g_ebullets.used衝突後FALSEに戻していないのが気になるのと、

すこし上に似たようなことをしている
//敵と自キャラの当たり判
の中で
g_enemies.jiki_life = 3;
としていますが、
//敵の弾と自キャラの当たり判定
ではありませんでした。

参考になれば幸いです。

初心者

Re:アクションゲーム

#12

投稿記事 by 初心者 » 16年前

はい
ありがとうございました。
少しずつ変更しながら、やってみます。

初心者

Re:アクションゲーム

#13

投稿記事 by 初心者 » 16年前

このアクションゲームには関係ありませんが、どうしても分からないので、この掲示板を使わせていただきます。
・丸と四角の当たり判定の関数
です。
教えてください。

組木紙織

Re:アクションゲーム

#14

投稿記事 by 組木紙織 » 16年前

龍神録プログラミングの館 34章 参照のこと

初心者

Re:アクションゲーム

#15

投稿記事 by 初心者 » 16年前

返信ありがとうございます。
見ました。

閉鎖

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