ラスボス弾発射について

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

ラスボス弾発射について

#1

投稿記事 by 華穂 » 16年前

今日までにBGMやSE以外のプログラムをすべて終えたくて
ここ2,3日徹夜の日々をすごしていました。

すみません、今日はまた、しばらくわからないところ・どうしていいかわからないところを
何度も書き込ませていただくかもしれません。


今詰まっているのはラスボスの弾の発射についてです。
まずはソースを。




//砲台
struct CANON
{
int C_HP;//体力は1つ16
double CanonX;
double CanonY;
//自身が生きているか
int CanonFlag;
//弾が生きているか
int TamaFlag;
int CKankaku;
int TamaX, TamaY;
};

//ボスクラス
class Boss
{
CANON Canon[5];
~~~~
};

void Boss::boss3
{
//体力がゼロより低ければ、消滅
if(Canon.C_HP <= 0) Canon.CanonFlag = 0;

if( BT3_Set == 1)
{
//敵の座標
double X,Y;
X = sin(B3Target_angle) * BSpeed;
Y = cos(B3Target_angle) * BSpeed;
Boss3X -= X;
Boss3Y -= Y;

//砲台を制御するためのs
int sX = 0,sY = 0;
if(Boss3X < 0){
Boss3X = 0;
sX = 1;
}
if(Boss3X > 640-160){
Boss3X = 640-160;
sX = 1;
}
if(Boss3Y < 0){
Boss3Y = 0;
sY = 1;
}
if(Boss3Y > 352-160){
Boss3Y = 352-160;
sY = 1;
}

for(int i = 0; i < 5; ++i){
if(sX == 0)Canon.CanonX -= X;
if(sY == 0)Canon.CanonY -= Y;
}


}

//X軸が320以上なら、左向き画像・逆なら逆画像
if(Boss3X > 320)
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[0], TRUE);

}
else
{
DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[1], TRUE);
}

//砲台の数だけループしつつ、砲台を描画
for(int i = 0; i < 5; ++i)
{
if(Canon.CanonFlag == 1){
int a = 0;
//隙間的な意味
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}
DrawGraph((int)Canon.CanonX+p, (int)Canon.CanonY, BCanon[a],TRUE);
}
}

//攻撃
for(int i = 0; i < 5; ++i)
{
if(Canon.CanonFlag == 1 && Canon.CKankaku == 0)
{
int a = 0;
int p = 0;
if(Boss3X > 320){}
else{
a = 1;
p = 140+2;
}

Canon.TamaX = Boss3X+3;
Canon[i].TamaY = Boss3Y+3;
if( Boss3X > 320)
{
CMuki = 1;
}
else
{
CMuki = 0;
}
Canon[i].CKankaku = 1;
Canon[i].TamaFlag = 0;
}
if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 1 && Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;
}

//弾のフラグで持っていた場合に発射するようにしようか迷ってます。
/*if(Canon[i].TamaFlag == 1)
{
if( CMuki = 1 )
{
Canon[i].TamaX -= BTSpeed;
}
if( CMuki = 0 )
{
Canon[i].TamaX += BTSpeed;
}

Canon[i].TamaFlag = 0;

}*/
//弾が画面外に出た場合は、存在状態を保持している変数を代入する。
if(Canon[i].TamaX >= 640 || Canon[i].TamaX <= -16)
{
Canon[i].CKankaku++;
if(Canon[i].CKankaku >= KANKAKU)
{
Canon[i].TamaFlag = 0;
}
}
DrawGraph( Canon[i].TamaX, Canon[i].TamaY, BTama, TRUE);
}
}




クラスの定義の前に、構造体を作っています。
ラスボスのクラスの中に、3つのボスを書いており、関数ごとに分けております。
今は、そのラスボスを書いており、ラスボスには5つの砲台が(16掛16)そなえ
られおり、ひとつに16体力を持っています。
つまり、このラスボスは5つの砲台をすべて倒せば消滅というもので、ボス自体の動きは
ホーミング、つまり自機を追っています。
こちらには書いていませんが、角度を取る関数もまた別のところで記しています。


現在では、ボスに砲台を取り付けることに成功しました。
ボスは自分の身長ぐらい(ボス大きさ160掛160)のたてを構えており、そのたてに上下
レーザの筒と、砲台縦5つを設置しています。

レーザはまだ、書いておりません。

砲台から弾が飛び出て、間をおいて飛び出してくるように書いているのですが・・なにやらデバッカの警告
が出てきてしまって・・上記のソースになにやら書いては危ないことを書き込んでいるのですが、
それがわかりません。

また、最初に砲台があることと、弾の発射の間隔を0として弾などを設定しています。

どこか飛び出すかは・・微調整が必要なため、まだ適当な数字しか入れておりません。




ご指摘・アドバイスがほしいところは、そのデバッカの原因であるソースの一文を教えてほしいことと、
弾のフラグから発射について書きたいのだが、現段階のソースをどのように変えればいいのでしょうか?





どうぞ、よろしくお願いします。

ねこ

Re:ラスボス弾発射について

#2

投稿記事 by ねこ » 16年前

とりあえず回答の前に・・・

1.ソースにはPreタグを付けて下さい
短いソースなら良いんですが、長いと読み辛いです。

2.エラー・警告について聞きたい場合はその内容を「明確」に記述して下さい
その文章じゃ何が起こってるのかさっぱり分かりません。

3.適度に寝て下さい
頭をスッキリさせないと簡単なミスを見落とします。

華穂

Re:ラスボス弾発射について

#3

投稿記事 by 華穂 » 16年前

長いソースにはpreダグをつけるのですが・・・。
先ほど久しぶりに一読のところを読みました。

次からは気をつけます。



エラーですが、
デバッカの画面が開かれ、
『STG.exe[252]でハンドルされていないwin32の例外が発生しました』

と書かれた小ウインドウが開かれます。



えと、3番目に関してですが、徹夜とはいいましたが、実は先ほどまで眠さに耐え切れず寝てまして・・。
1時間前ほどに起きましたので、ある程度頭はすっきりしております。

ご迷惑をおかけして申し訳ありません。

ねこ

Re:ラスボス弾発射について

#4

投稿記事 by ねこ » 16年前

記事の修正あるいは再投稿でPre使うだけでも良いです。

エラーについては実行中のエラーのため正確な情報が出ていない状態です。
アプローチとしては「どのタイミングで」そのエラーが落ちるかを調べます。
「起動直後」「最初に弾が撃たれた瞬間」「敵を倒した瞬間」「弾が画面外に消えた瞬間」などなど
落ちるにしてもある程度「同じタイミング」で落ちるはずです。
落ちる箇所が絞り込めればソースのどの部分を検証すればいいのか分かってきます。
こちらでは実行出来ないのでそのあたりの情報を頂ければ解決しやすくなります。

<3番
まぁ2,3日徹夜で~とか書かれてるとつい「ただの見落としなんじゃない?」と思われるので書いただけです。

夢夢

Re:ラスボス弾発射について

#5

投稿記事 by 夢夢 » 16年前

//砲台 
struct CANON 
{ 
	int C_HP;//体力は1つ16 
	double CanonX; 
	double CanonY; 
	//自身が生きているか 
	int CanonFlag; 
	//弾が生きているか 
	int TamaFlag; 
	int CKankaku; 
	int TamaX, TamaY; 
}; 

//ボスクラス 
class Boss 
{ 
	CANON Canon[5]; 
	~~~~ 
}; 

void Boss::boss3 
{ 
	//体力がゼロより低ければ、消滅 
	if(Canon.C_HP <= 0) Canon.CanonFlag = 0; 
	
	if( BT3_Set == 1) 
	{ 
		//敵の座標 
		double X,Y; 
		X = sin(B3Target_angle) * BSpeed; 
		Y = cos(B3Target_angle) * BSpeed; 
		Boss3X -= X; 
		Boss3Y -= Y; 
		
		//砲台を制御するためのs 
		int sX = 0,sY = 0; 
		if(Boss3X < 0){ 
			Boss3X = 0; 
			sX = 1; 
		} 
		if(Boss3X > 640-160){ 
			Boss3X = 640-160; 
			sX = 1; 
		} 
		if(Boss3Y < 0){ 
			Boss3Y = 0; 
			sY = 1; 
		} 
		if(Boss3Y > 352-160){ 
			Boss3Y = 352-160; 
			sY = 1; 
		} 

		for(int i = 0; i < 5; ++i){ 
			if(sX == 0)Canon.CanonX -= X; 
			if(sY == 0)Canon.CanonY -= Y; 
		} 

	} 

	//X軸が320以上なら、左向き画像・逆なら逆画像 
	if(Boss3X > 320) 
	{ 
		DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[0], TRUE); 
	} 
	else 
	{ 
		DrawGraph( (int)Boss3X, (int)Boss3Y, Boss3[1], TRUE); 
	} 

	//砲台の数だけループしつつ、砲台を描画 
	for(int i = 0; i < 5; ++i) 
	{ 
		if(Canon.CanonFlag == 1){ 
			int a = 0; 
			//隙間的な意味 
			int p = 0; 
			if(Boss3X > 320){} 
			else{ 
				a = 1; 
				p = 140+2; 
			} 
			DrawGraph((int)Canon.CanonX+p, (int)Canon.CanonY, BCanon[a],TRUE); 
		} 
	} 

	//攻撃 
	for(int i = 0; i < 5; ++i) 
	{ 
		if(Canon.CanonFlag == 1 && Canon.CKankaku == 0) 
		{ 
			int a = 0; 
			int p = 0; 
			if(Boss3X > 320){} 
			else{ 
				a = 1; 
				p = 140+2; 
			} 
	
			Canon.TamaX = Boss3X+3; 
			Canon[i].TamaY = Boss3Y+3; 
			if( Boss3X > 320) 
			{ 
				CMuki = 1; 
			} 
			else 
			{ 
				CMuki = 0; 
			} 
			Canon[i].CKankaku = 1; 
			Canon[i].TamaFlag = 0; 
		} 
		if(Canon[i].CanonFlag == 1 && Canon[i].CKankaku == 1 && Canon[i].TamaFlag == 1) 
		{ 
			if( CMuki = 1 ) 
			{ 
				Canon[i].TamaX -= BTSpeed; 
			} 
			if( CMuki = 0 ) 
			{ 
				Canon[i].TamaX += BTSpeed; 
			} 
	
			Canon[i].TamaFlag = 0; 
		} 
	
		//弾のフラグで持っていた場合に発射するようにしようか迷ってます。 
		/*if(Canon[i].TamaFlag == 1) 
		{ 
			if( CMuki = 1 ) 
			{ 
				Canon[i].TamaX -= BTSpeed; 
			} 
			if( CMuki = 0 ) 
			{ 
			Canon[i].TamaX += BTSpeed; 
			} 
	
			Canon[i].TamaFlag = 0; 
	
		}*/ 
		//弾が画面外に出た場合は、存在状態を保持している変数を代入する。 
		if(Canon[i].TamaX >= 640 || Canon[i].TamaX <= -16) 
		{ 
			Canon[i].CKankaku++; 
			if(Canon[i].CKankaku >= KANKAKU) 
			{ 
				Canon[i].TamaFlag = 0; 
			} 
		} 
		DrawGraph( Canon[i].TamaX, Canon[i].TamaY, BTama, TRUE); 
	} 
}

華穂

Re:ラスボス弾発射について

#6

投稿記事 by 華穂 » 16年前

なるほど・・・そのようにして、使うのですね。
ねこ様、ありがとうございます。
それらの情報をこれから調べてみたいと思います。


また、実は今はまだ完ぺきにひとつだけ分からないところがあるのですが・・
そこは今から調整をかけて、なんとかできたらいいなぁと思っていますが、もしかしたら
こちらでまた書き込みさせていただくかもしれません。
その時はどうぞよろしくお願いします。



えと・・夢夢様はどうしたのでしょうか?
私の眼が間違っているのか・・同じプログラムに見えるのですが・・。






Justy

Re:ラスボス弾発射について

#7

投稿記事 by Justy » 16年前

[color=#d0b0c0" face="monospace]
>私の眼が間違っているのか・・同じプログラムに見えるのですが・
[/color]

 きっと見やすくなるよう整形してくれたのだと思います。

閉鎖

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