ページ 11

弾の数が想定より多い

Posted: 2012年3月18日(日) 18:36
by 滝上
お久しぶりです、滝上(アカウントを忘れました)です。以前よりプログラムの作成でお世話になってます。
この度、ただの円形の弾幕を作りました。
実際に動かしてみると、たしかに [円形に8発発射] されるのです。 <---実現目標
しかし、[8発発射された後に、4発無駄に発射] されてしまうのです。    <---問題点

コード:

void test(){
	Test_counter++;
	//すべての弾が窓の外に出ているかチェック
	for(int k=0; k<8; k++){					   ―
		if(Shote[k].flag==0) Test_contl++;     |☆
		else			     Test_contl=0; break; ―
	}
	//上の処理がOK(=すべての弾のフラグが消えていれば)、 カウンターが20なら弾配置のループ(上記処理が影響してる?)
	if(Test_contl%7==0 && Test_counter%20==0){
			for(int i=0; i<8; i++){
				if(Shote[i].flag==0){
					Shote[i].flag=1;
					Shote[i].x = Enemy.x;
					Shote[i].y = Enemy.y;
					if(i==0) Shote[i].angle = atan2(Sky.y - Enemy.y, Sky.x - Enemy.x);
					else     Shote[i].angle = Shote[i-1].angle+(45*(PI2/360));
				}
			}
	}
	//弾の移動と窓の外に出たらフラグを戻す(この辺りには特に問題ないと考えてます)
	for(int j=0; j<8; j++){
		if(Shote[j].flag==1){
			Shote[j].x += cos(Shote[j].angle)*10;
			Shote[j].y += sin(Shote[j].angle)*10;
			DrawGraph(Shote[j].x, Shote[j].y, Shote_image, TRUE);
		}
		if(Shote[j].x<0 || Shote[j].x>800 || Shote[j].y<0 || Shote[j].y>800)
				Shote[j].flag = 0;
	}
}
私自身は、☆マークの範囲に原因がありそれ以降のコードに影響しているように感じています。
一つ一つの弾幕をその度にテストしながら作ってるので多少コードにおかしい点があると思います。
なにか、良い解決方法や組み方がありましたらお願いします。

Re: 弾の数が想定より多い

Posted: 2012年3月18日(日) 18:51
by みけCAT

コード:

    for(int k=0; k<8; k++){                    ―
        if(Shote[k].flag==0) Test_contl++;     |☆
        else                 Test_contl=0; break; ―
    }
このコードだと、if文の結果にかかわらずbreak;しますが、想定内ですか?

コード:

if(Test_contl%7==0 && Test_counter%20==0){
Test_contlが0または7の時、Test_contl%7==0が成立します。
☆のコードでbreak;が無く、Shote[k].flagが全て0の時は、
(この関数の最初でTest_contlが0だと仮定すると)Test_contlは8になります。

Re: 弾の数が想定より多い

Posted: 2012年3月18日(日) 20:15
by 滝上
早速のアドバイスありがとうございます。
訂正した結果

コード:

//テストプログラム
void test(){
	//すべての弾が窓の外に出ているかチェック
	if(Test_contl==1){
		for(int k=0; k<8; k++){
			if(Shote[k].flag==1) break;
			else                 Test_contl=0; 
		}
	}
	//上の処理がOK、カウンターが20なら弾配置のループ
	if(Test_contl==0 && Test_counter%10==0){
			for(int i=0; i<8; i++){
				if(Shote[i].flag==0){
					Shote[i].flag=1;
					Shote[i].x = Enemy.x;
					Shote[i].y = Enemy.y;
					if(i==0) Shote[i].angle = atan2(Sky.y - Enemy.y, Sky.x - Enemy.x);
					else     Shote[i].angle = Shote[i-1].angle+(45*(PI2/360));
				}
			}
			Test_contl=1;
	}
	//弾の移動と窓の外に出たらフラグを戻す
	for(int j=0; j<8; j++){
		if(Shote[j].flag==1){
			Shote[j].x += cos(Shote[j].angle)*10;
			Shote[j].y += sin(Shote[j].angle)*10;
			DrawGraph(Shote[j].x, Shote[j].y, Shote_image, TRUE);
		}
		if(Shote[j].x<0 || Shote[j].x>800 || Shote[j].y<0 || Shote[j].y>800)
				Shote[j].flag = 0;
	}
	Test_counter++;
}
このようになりました。
結果
弾が遅れて発射されること(想定より多く)はなりました。
しかし、今度は弾数が少なくなることがあります。
さらに、見なおしてみます。

Re: 弾の数が想定より多い

Posted: 2012年3月18日(日) 21:14
by みけCAT
Shote[k].flagが1個でも0ならTest_contlが0になってしまいます。

Re: 弾の数が想定より多い

Posted: 2012年3月19日(月) 21:50
by 滝上

コード:

	if(Test_contl==1){
		int c = 0;
		for(int k=0; k<8; k++){
			if(Shote[k].flag==0) c++;
		}
		if(c==8){
			Test_contl=0;
		}

	}
↑のように変更いたしました。
今のところ、正常に動作しています。
アドバイスありがとうございました。解決とさせていただきます。
また、お世話になるかもしれませんがよろしくおねがいします。