ゲームの動作確認をしていましたが、バグが発生・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 5年前

ゲームの動作確認をしていましたが、バグが発生・・

#1

投稿記事 by samusu0905 » 5年前

ゲームの動作確認をしていたら、プレイヤーの衝突判定でバグを見つけたんですが、どの処理が間違っていてバグが起きているのか
わかりません。 自分が作っているゲームは敵を数字で1、2と分かりやすく分けています。

ゲームプレイ画面に移動して敵1が普通に発生してくるところと、敵1がビームを発射するところまでは問題ありませんでした。衝突判定もここまでは問題ありません。後、プレイヤーが敵1と衝突したら残機が1減って、プレイヤーが敵1のビームと衝突したら残機は同じく1減ります。ここも一応問題ありません。
バグ発生は、プレイ中におこりました。存在していない敵2と衝突したみたいになっているんです。
しかもプレイヤーはダメージを受けていて、残機も2減ってしまっています。どこがおかしいのかよくわかりません。衝突判定がおかしいのではと思って、衝突処理をもう一度見直しましたが、特になかったです。
コード提示しますので訂正お願いします。

コード:

//*****************************************************************************
//  衝突判定の処理
//*****************************************************************************
#include <stdio.h>						//C言語
#include "gs.h"							//学内ライブラリィ
#include "def.h"						//共通定義
#include "Collision.h"					//衝突判定
#include "Graphics.h"					//グラフィック処理



//変数宣言-----------------------------------


//変数参照-----------------------------------
extern OBJ gDragon;						//ドラゴン
extern OBJ gDragonLife[DRAGONLIFE_MAX];	//ドラゴン残機
extern OBJ gFire[FIRE_MAX];				//炎
extern OBJ gEnemy1[ENEMY1_MAX];			//敵1
extern OBJ gEnemy1Beam[ENEMY1BEAM_MAX];	//敵1ビーム
extern OBJ gEnemy2[ENEMY2_MAX];			//敵2
extern gsSound sBombSE;
extern gsSound sDamageSE;				//ドラゴンのダメージ
extern int gScore;						//スコア
extern gsTexture sScoreText;			//スコア文字



//開始------------------------------------------------------------------------
void CollisionStart(void)
{
	gScore = 0;			//スコアの初期化
}


//メイン処理------------------------------------------------------------------
void CollisionMain(void)
{
	CollisionDragon();			//ドラゴンの衝突判定
	CollisionFire();			//炎の衝突判定
}


//表示------------------------------------------------------------------------
void CollisionDraw(void)
{
	char str[100];

	gsDraw2D( sScoreText, 0,  30);

	//スコアの数字の表示
	sprintf( str, "%05d", gScore);
	GraphicsDrawText( 60,30, str );
}


//ドラゴンの衝突判定----------------------------------------------------------
void CollisionDragon(void)
{
	CollisionDragonEnemy1();			//ドラゴンと敵1の衝突判定

	CollisionDragonEnemy1Beam();		//ドラゴンと敵1ビームの衝突判定

	CollisionDragonEnemy2();			//ドラゴンと敵2の衝突判定

}

//ドラゴンと敵1の衝突判定------------------------------------------------------
void CollisionDragonEnemy1(void)
{
	int i;

	//敵の数ループ
	for(i=0; i<ENEMY1_MAX; i++)
	{
		//敵が存在すれば
		if( gEnemy1[i].flg == ON)
		{
			CollisionDragonEnemy1One(i);	//ドラゴンと敵1の衝突判定の実施
		}
	}
}


//ドラゴンと敵1の衝突判定の実施------------------------------------------------
void CollisionDragonEnemy1One(int i)
{
	if( gDragon.x+DRAGON_XSIZE > gEnemy1[i].x &&		//ドラゴンの右>敵の左
		gDragon.x < gEnemy1[i].x+ENEMY1_XSIZE &&		//ドラゴンの左<敵の右
		gDragon.y+DRAGON_YSIZE > gEnemy1[i].y &&		//ドラゴンの下>敵の上
		gDragon.y < gEnemy1[i].y+ENEMY1_YSIZE)			//ドラゴンの上<敵の下
	{
		gDragon.timer = 1;								//ダメージ中にする
		gEnemy1[i].flg = OFF;							//敵が存在しない
		gsPlaySound( sDamageSE, LOOP_OFF);				//ドラゴンのダメージSE
		gDragon.HP -= 1;								//ドラゴンのダメージ
	}
}


//ドラゴンと敵1ビームの衝突判定-----------------------------------------------
void CollisionDragonEnemy1Beam(void)
{
	//変数iを宣言
	int i;

	//敵1ビームの数ループ
	for( i=0; i<ENEMY1BEAM_MAX; i++)
	{
		//敵1が存在していれば
		if( gEnemy1Beam[i].flg == ON)
		{
			CollisionDragonEnemy1BeamOne(i);		//ドラゴンと敵1ビームの衝突判定の実施
		}
	}
}


//ドラゴンと敵1ビームの衝突判定の実施---------------------------------------------------
void CollisionDragonEnemy1BeamOne(int i)
{
	if( gDragon.x+DRAGON_XSIZE > gEnemy1Beam[i].x &&			//ドラゴンの右>敵1ビームの左
		gDragon.x < gEnemy1Beam[i].x+ENEMY1BEAM_XSIZE &&		//ドラゴンの左<敵1ビームの右
		gDragon.y+DRAGON_YSIZE > gEnemy1Beam[i].y &&			//ドラゴンの下>敵1ビームの上
		gDragon.y < gEnemy1Beam[i].y+ENEMY1BEAM_YSIZE)			//ドラゴンの上<敵1ビームの下
	{
		gDragon.timer = 1;					//ダメージ中にする
		gEnemy1Beam[i].flg = OFF;			//敵1ビームを存在しなくする
		gsPlaySound( sDamageSE, LOOP_OFF);	//ダメージSE
		gDragon.HP -= 1;
	}

}


//ドラゴンと敵2の衝突判定--------------------------------------------------------------
void CollisionDragonEnemy2(void)
{
	int i;

	for(i=0; i<ENEMY2_MAX; i++)
	{
		//敵2が存在していれば
		if( gEnemy2[i].flg == ON)
		{
			CollisionDragonEnemy2One(i);			//ドラゴンと敵2の衝突判定の実施
		}
	}
}


//ドラゴンと敵2の衝突判定の実施-------------------------------------------------------
void CollisionDragonEnemy2One(int i)
{
	if( gDragon.x+DRAGON_XSIZE > gEnemy2[i].x-20  &&	//ドラゴンの右>敵2の左
		gDragon.x+30 < gEnemy2[i].x+ENEMY2_XSIZE &&		//ドラゴンの左<敵2の右
		gDragon.y+DRAGON_YSIZE > gEnemy2[i].y-40 &&		//ドラゴンの下>敵2の上
		gDragon.y+20 < gEnemy2[i].y+ENEMY2_YSIZE)		//ドラゴンの上<敵2の下
	{
		gDragon.timer = 1;								//ダメージ中にする
		gEnemy2[i].flg = OFF;							//敵2を存在させない
		gsPlaySound( sDamageSE, LOOP_OFF);				//ドラゴンのダメージSE
		gDragon.HP -= 2;								//ドラゴンのダメージ
	}
}


//炎の衝突判定-------------------------------------------------------------------------
void CollisionFire(void)
{
	int i;

	//炎の数ループ
	for(i=0; i<FIRE_MAX; i++)
	{
		//炎が存在すれば
		if( gFire[i].flg == ON)
		{
			CollisionFireEnemy1(i);			//炎と敵1の衝突判定
		}
	}

	//炎の数ループ
	for(i=0; i<FIRE_MAX; i++)
	{
		//炎が存在すれば
		if( gFire[i].flg == ON)
		{
			CollisionFireEnemy2(i);			//炎と敵2の衝突判定
		}
	}

	//炎の数ループ
	for(i=0; i<FIRE_MAX; i++)
	{
		//炎が存在すれば
		if( gFire[i].flg == ON)
		{
			CollisionFireEnemy1Beam(i);		//炎と敵1ビームの衝突判定
		}
	}
}


//炎と敵1の衝突判定----------------------------------------------------------------------
void CollisionFireEnemy1(int f)
{
	int i;

	//敵1の数ループ
	for(i=0; i<ENEMY1_MAX; i++)
	{
		//敵が存在すれば
		if( gEnemy1[i].flg == ON)
		{
			CollisionFireEnemy1One(f,i);		//炎と敵の衝突判定の実施
		}
	}
}


//炎と敵1の衝突判定の実施----------------------------------------------------------------
void CollisionFireEnemy1One(int f, int i)
{
	if( gFire[f].x+FIRE_XSIZE > gEnemy1[i].x &&					//炎の右>敵の左
		gFire[f].x < gEnemy1[i].x+ENEMY1_XSIZE &&				//炎の左<敵の右
		gFire[f].y+FIRE_YSIZE > gEnemy1[i].y &&					//炎の下>敵の上
		gFire[f].y < gEnemy1[i].y+ENEMY1_YSIZE )				//炎の上<敵の下
	{
		gFire[f].flg = OFF;							//炎が存在していない
		gEnemy1[i].flg = OFF;						//敵が存在していない
		gsPlaySound( sBombSE, LOOP_OFF);			//敵のダメージBGM
		gScore += 30;								//敵1のスコア30点
	}
}


//炎と敵1ビームの衝突判定---------------------------------------------------------------
void CollisionFireEnemy1Beam(int f)
{
	int i;

	//敵1ビームの数ループ
	for( i=0; i<ENEMY1BEAM_MAX; i++)
	{
		if( gEnemy1Beam[i].flg == ON)
		{
			CollisionFireEnemy1BeamOne(f,i);		//炎と敵1ビームの衝突判定の実施
		}
	}
}


//炎と敵1ビームの衝突判定の実施----------------------------------------------------------
void CollisionFireEnemy1BeamOne(int f, int i)
{
	if( gFire[f].x+FIRE_XSIZE > gEnemy1Beam[i].x &&				//炎の右>敵1ビームの左
		gFire[f].x < gEnemy1Beam[i].x+ENEMY1BEAM_XSIZE &&		//炎の左<敵1ビームの右
		gFire[f].y+FIRE_YSIZE > gEnemy1Beam[i].y &&				//炎の下>敵1ビームの上
		gFire[f].y < gEnemy1Beam[i].y+ENEMY1BEAM_YSIZE)			//炎の上<敵1ビームの下
	{
		gEnemy1Beam[i].flg = OFF;			//敵1ビームが存在しない
		gFire[f].flg = OFF;					//炎が存在しない
		if( gDragon.HP < 12)
		{
			gDragon.HP += 1;				//残機回復
		}
	}
}


//炎と敵2の衝突判定----------------------------------------------------------------------
void CollisionFireEnemy2(int f)
{
	int i;

	//敵2の数ループ
	for(i=0; i<ENEMY2_MAX; i++)
	{
		//敵2が存在すれば
		if( gEnemy2[i].flg == ON)
		{
			CollisionFireEnemy2One(f, i);			//炎と敵2の衝突判定の実施を行う
		}
	}
}


//炎と敵2の衝突判定の実施----------------------------------------------------------------
void CollisionFireEnemy2One(int f, int i)
{
	if( gFire[f].x+FIRE_XSIZE > gEnemy2[i].x-20 &&				//炎の右>敵2の左
		gFire[f].x+20 < gEnemy2[i].x+ENEMY2_XSIZE &&			//炎の左<敵2の右
		gFire[f].y+FIRE_YSIZE > gEnemy2[i].y-20 &&				//炎の下>敵2の上
		gFire[f].y+20 < gEnemy2[i].y+ENEMY2_YSIZE)				//炎の上<敵2の下
	{
		gFire[f].flg = OFF;					//炎を存在させない
		gEnemy2[i].flg = OFF;				//敵2を存在させない
		gsPlaySound( sBombSE, LOOP_OFF);	//敵ダメージSE
		gScore += 40;						//スコアを40点加算する
	}
}
これ↑が衝突判定処理で、

コード:

//*******************************************************************************************
//                    敵2の処理
//*******************************************************************************************
#include <stdio.h>							//C言語
#include "gs.h"								//学内ライブラリィ
#include "def.h"							//共通定義
#include "Enemy2.h"							//敵2
#include "Graphics.h"						//グラフィック処理
#include "Enemy2Beam.h"						//敵2ビーム


//変数宣言-------------------------------------------------------
OBJ gEnemy2[ENEMY2_MAX];					//敵2の構造体


//変数参照-------------------------------------------------------
extern gsTexture sEnemy2;					//敵2
extern int gScore;							//スコア


//敵2の開始---------------------------------------------------------------------------------
void Enemy2Start(void)
{
	//変数 iを宣言
	int i;

	for(i=0; i<ENEMY2_MAX; i++)
	{
		gEnemy2[i].flg = OFF;			//敵2を存在させない
	}
}


//敵2のメイン処理----------------------------------------------------------------------------
void Enemy2Main(void)
{
	Enemy2Set();						//敵2の発生
	Enemy2Move();						//敵2の移動
	Enemy2InScreen();					//敵2の移動範囲の制限
	//Enemy2Shot();						//敵2がビームを発射
}


//敵2の表示-----------------------------------------------------------------------------------
void Enemy2Draw(void)
{
	//変数 i, x, y, w, h, tx, ty, tw, th, angleを宣言
	int i;
	int x=0,y=0,w=0,h=0, tx=0, ty=0, tw=0, th=0;
	float angle=0;

	//敵2の数ループ
	for(i=0; i<ENEMY2_MAX; i++)
	{
		//敵2が存在すれば
		if( gEnemy2[i].flg == ON)
		{
			Enemy2DrawOne(i,x,y,w,h,tx,ty,tw,th,angle);			//敵2の表示の実施を行う
		}
	}
}


//敵2の表示の実施------------------------------------------------------------------------------
void Enemy2DrawOne(int i, int x, int y, int w, int h, int tx, int ty, int tw,int th, float rotate)
{
	//タイプを2に設定
	if( gEnemy2[i].type == TYPE2)
	{
		//敵2の回転角度
		gsDraw2DPartEx( sEnemy2, (int)gEnemy2[i].x, (int)gEnemy2[i].y,
			(int)gEnemy2[i].w, (int)gEnemy2[i].h, (int)gEnemy2[i].tx,
			(int)gEnemy2[i].ty, (int)gEnemy2[i].tw, (int)gEnemy2[i].th,
			(float)gEnemy2[i].rotate, 0x80ffffffff );
	}
}


//敵2の発生------------------------------------------------------------------------------------
void Enemy2Set(void)
{
	//変数 iを宣言
	int i;

	//敵2の数をループ
	for(i=0; i<ENEMY2_MAX; i++)
	{
		//敵2が存在しなければ
		if( gEnemy2[i].flg == OFF)
		{
			Enemy2SetOne(i);						//敵2の発生の実施を行う
		}
	}
}


//敵2の発生の実施-------------------------------------------------------------------------------
void Enemy2SetOne(int i)
{
	//1/300の確率
	if(rand()%300 == 0)
	{
		gEnemy2[i].flg = ON;						//敵2が存在している
		gEnemy2[i].x = (float)(rand()%1010);		//敵2のX座標をランダムに設定
		gEnemy2[i].y = -100;						//敵2のY座標をランダムに設定
		gEnemy2[i].w = 60;							//敵2の幅
		gEnemy2[i].h = 58;							//敵2の高さ
		gEnemy2[i].tw = 60;							//敵2先の幅
		gEnemy2[i].th = 60;							//敵2先の高さ
	}

	
	//1/5の確率
	if(rand()%3 == 0)
	{
		gEnemy2[i].dir = 4;							//右向き
	}
	else
	{
		gEnemy2[i].dir = -4;						//左向き
	}

	//種類によって敵を設定
	if( gScore > 2500)
	{
		gEnemy2[i].type = TYPE2;
	}
}


//敵2の移動-------------------------------------------------------------------------------------
void Enemy2Move(void)
{
	//変数 i, rotateを宣言
	int i;
	float rotate=0;

	//敵2の数をループ
	for( i=0; i<ENEMY2_MAX; i++)
	{
		if( gEnemy2[i].flg == ON)
		{
			gEnemy2[i].y += 4;						//下に移動
			gEnemy2[i].rotate -= 1.5;				//敵2を
			//敵2のY座標が400より小さければ
			if( gEnemy2[i].y >= -20)
			{
				gEnemy2[i].x += gEnemy2[i].dir;		//右に移動
			}
		}
	}
}


//敵2の移動範囲の制限---------------------------------------------------------------------------
void Enemy2InScreen(void)
{
	//変数 iを宣言
	int i;

	//敵2の数ループ
	for(i=0; i<ENEMY2_MAX; i++)
	{
		//敵2が存在すれば
		if( gEnemy2[i].flg == ON)
		{
			Enemy2InScreenOne(i);				//敵2の移動範囲の制限の実施
		}
	}
}


//敵2の移動範囲の制限の実施----------------------------------------------------------------------
void Enemy2InScreenOne(int i)
{
	//敵2のY座標から-610引いた値が敵2の縦サイズより大きければ下向き
	if( gEnemy2[i].y-690 > ENEMY2_YSIZE)
	{
		gEnemy2[i].flg = OFF;				//敵2が存在しない
	}

	//敵2のX座標が100より小さければ左向き
	if( gEnemy2[i].x < 100)
	{
		gEnemy2[i].dir = 4;					//左向きに移動
	}

	//敵2のX座標が880より大きければ右向き
	if( gEnemy2[i].x > 880)
	{
		gEnemy2[i].dir = -4;				//右向きに移動
	}
}
これ↑が敵2のコードです。
何か問題があればお願いします。
訂正して書いて頂けるとありがたいです。

また、わかりずらかったら、もう少し詳しく説明します。

box
記事: 1739
登録日時: 9年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#2

投稿記事 by box » 5年前

samusu0905 さんが書きました:

コード:

		gEnemy2[i].y = -100;						//敵2のY座標をランダムに設定
	//1/5の確率
	if(rand()%3 == 0)
			//敵2のY座標が400より小さければ
			if( gEnemy2[i].y >= -20)
	//敵2のY座標から-610引いた値が敵2の縦サイズより大きければ下向き
	if( gEnemy2[i].y-690 > ENEMY2_YSIZE)
こういう風に、実体とコメントとが食い違っているコードを見ると、
「本当は何がしたいんだろう?」と思ってしまうわけであります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#3

投稿記事 by samusu0905 » 5年前

そこら辺は少し変えただけです。

コード:

gEnemy2[i].y = -100;						//敵2のY座標を設定

//1/5の確率
if(rand()%5 == 0)

//敵2のY座標が20より小さければ
			if( gEnemy2[i].y >= -20)
			{
				gEnemy2[i].x += gEnemy2[i].dir;		//右に移動
			}

//敵2のY座標から-690引いた値が敵2の縦サイズより大きければ下向き
	if( gEnemy2[i].y-690 > ENEMY2_YSIZE)
	{
		gEnemy2[i].flg = OFF;				//敵2が存在しない
	}
それぞれ訂正しました。すみませんでした。

アバター
usao
記事: 1564
登録日時: 6年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#4

投稿記事 by usao » 5年前

>バグ発生は、プレイ中におこりました。存在していない敵2と衝突したみたいになっているんです。
>しかもプレイヤーはダメージを受けていて、残機も2減ってしまっています。
これは
プレイ中に見られた現象面(残機が2減る)から「敵2と衝突したことになっているようだ」と推測しているだけでしょうか.
それとも,実際に敵2との衝突判定が真となる動作をしていることまでは確認できているのでしょうか.

前者のような状況であれば,
まずは本当に ”敵2と衝突したと判定されたことによってその現象が起こっているのかどうか” を確認されると良いでしょう.
(CollisionDragonEnemy2One()のifの中に入ってるか否か,でしょうかね.
 デバッガ等を使えればいいですが,そうでなくても,例えばここで特別な表示をさせてみたり
 別のSEを鳴らしてみたりとかさせてみれば とりあえず手っ取り早く確認できるかもしれませんね)

本当にここの判定が通ってしまっているようならば
「敵2がいないことになっているはず」という前提の部分が間違っているのかもしれません.
(例えば,Enemy2Start()という関数を最初に呼ぶべきなのにそれを忘れているとか)

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#5

投稿記事 by samusu0905 » 5年前

回答有難うございます。
自分もCollisionDragonEnemy2One()関数では色々と試しました。
ですが、敵2と衝突する処理は変わりありませんでした。
もう少し自分で試してみます。
もしかしたら、敵1の発生の実施処理か敵2の発生の実施処理でバグを引き起こすようなプログラムを書いてしまっている
かもしれません。バグの修正場所が分からなくなったらまた返事を返します。
今後ともよろしくお願いします。

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#6

投稿記事 by samusu0905 » 5年前

「敵2と衝突したことになっている」ってのは推測ではなく本当です。
実際に自分も敵2と衝突しているところを色々と変えたりしましたが、
やはり、結果は変わりませんでした。とにかく敵2のコードでどこがバグなのか確認します。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: ゲームの動作確認をしていましたが、バグが発生・・

#7

投稿記事 by Tatu » 5年前

コードを見るとgEnemy2のフラグがONになっているのに
描画されていないという気がします。

gEnemy2.typeは何の意味があるんですか?
TYPE2の時しか描画しないようになっていますがgEnemy3にした方がいいのではないですか?

敵2の表示用の関数にi以外の引数をつけている理由がわかりません。


個人的な感想ですがコメントの「~~の実施」は「~~の処理」の方がいいと思います。
「~~の実施を行う」は「~~を行う」で十分でしょう。

4/11 17:45追記
「~~の実施」は全ての敵2の処理と1体の敵の処理を区別するためみたいですね。
それならば、敵2全てに関連する処理は「全ての敵2の~~」、
i番目の敵2に関連する処理は「i番目の敵2の~~」と表現してはどうでしょうか。

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#8

投稿記事 by samusu0905 » 5年前

回答有難うございます。
typeは敵を区別するために作った構造体です。
フラグはちゃんとONになっていて、描画処理もできているのですが・・。
そもそも、敵2は敵1を何体か倒してスコアがある程度増えたら発生させるようにしています。
それまで、敵2は発生しない処理となっています。ですが、今回のバグは
描画されていない敵2が発生してしまっている状態です。
直すべき点はだいたいわかりますが、それでも何故かうまくいかないです。
まず、1.「敵2はスコアがある程度増えたら発生させる」2.「敵2が発生したら敵1は発生しない」
たったこれだけの事なんですよ。 まあ、多分自分のプログラムミスもあるかと思うので。
出来たらバグ解決ということで。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: ゲームの動作確認をしていましたが、バグが発生・・

#9

投稿記事 by Tatu » 5年前

>gEnemy2.typeは敵を区別するために作った
「敵2のタイプを区別するために作った」という意味でなければ
「敵1をgEnemy1、敵2をgEnemy2のように分類することでわかりやすくする」
というのがあまり役に立ってなさそうです。
「全ての敵をgEnemyで管理し、gEnemy.typeがTYPE1ならば敵1用の処理、
TYPE2なら敵2用の処理をする」という仕様にするつもりなのですか?

>1.「敵2はスコアがある程度増えたら発生させる」
投稿されたコードではスコアに関係なく敵2が発生し、
スコアがある程度以上ならtypeがTYPE2の敵2が発生する
というように読めるのですが。

>2.「敵2が発生したら敵1は発生しない」
敵1の処理が載せられていないのでわかりません。
敵1が無限に発生する状態から手を加えていないなら
敵2が発生しようとしまいと敵1は発生すると思います。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: ゲームの動作確認をしていましたが、バグが発生・・

#10

投稿記事 by Tatu » 5年前

>gEnemy2.type
今のところ、この変数に大した意味はなさそうなので
敵2の描画処理でTYPE2かどうかの判定は要らないでしょう。

>敵1と敵2の発生
今どの敵を発生させるかを判断する処理を敵1、敵2の処理とは別に作り、
敵1を発生させるべきならば敵1の発生を、
敵2を発生させるべきならば敵2の発生を
するようにしてはどうでしょうか。

敵1の発生処理でスコアがある値以上なら発生させない、
敵2の発生処理でスコアがある値以下なら発生させない
というように書き直しても解決しそうですが
今後敵3、敵4、…と追加するたびに
スコアの判定をそれぞれの発生処理に書かなければならなく、管理が面倒になりそうです。

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#11

投稿記事 by samusu0905 » 5年前

回答有難うございます。
スコアによって敵を発生させる処理は出来ていますが、バグは直りませんね。
それと、敵を数字で表しているのはもう一つ理由がありまして、敵1と敵2の画像サイズをそれぞれ変えているのでgEnemyで共通させる事は出来ないんです。もしサイズがどちらも同じならば共通させますよ。画像サイズを合わせようとしましたが、全然合わなかったので
区別することにしただけです。
>敵1を発生させるべきならば敵1の発生
>敵2を発生させるべきならば敵2の発生
どちらも書き込んであります。ですから、それぞれの敵発生は関係ないので衝突判定が問題だと思っています。
衝突判定のところでプレイヤーと敵2のビームが衝突する処理を書いていたらバグが発生しました。

samusu0905
記事: 336
登録日時: 5年前

Re: ゲームの動作確認をしていましたが、バグが発生・・

#12

投稿記事 by samusu0905 » 5年前

今、スコアの部分を書き直したら解決しました。
色々と教えていただき有難うございました。
やはり衝突判定処理は関係ありませんでした。
敵1と敵2それぞれの発生処理のところでスコアによってどのタイプの敵を発生させるのか、そこが問題でした。
Tatuさんの言った通りに
>敵1の発生処理でスコアがある値以上なら発生させない
>敵2の発生処理でスコアがある値以下なら発生させない
この処理をそれぞれの処理に書き直したらバグ直りました。
自分のちょっとした凡ミスですね。これからは気を付けてプログラミングに取り組みます。

閉鎖

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