ページ 11

for文の使用

Posted: 2014年8月12日(火) 07:16
by kotori
現在このサイトでゲーム制作の方を行っておりますhttp://bituse.info/game/shot/8

そこでこのような記述に疑問を抱きました。

コード:

/*ここではPSHOT_NUM=20とします。*/

//キーが押されててかつ、6ループに一回発射
	if(key[KEY_INPUT_Z]==1 && count%6==0){
		for(int i=0;i<PSHOT_NUM;++i){
			if(shot[i].flag==false){
				shot[i].flag=true;
				shot[i].x=x;
				shot[i].y=y;
				break;
			}
		}
	}

	//弾を移動させる処理
	for(int i=0;i<PSHOT_NUM;++i){
		//発射してる弾だけ
		if(shot[i].flag){
			shot[i].y-=PSHOT_SPEED;

			//画面の外にはみ出したらフラグを戻す
			if(shot[i].y<-10){
				shot[i].flag=false;
			}
		}
	}
これだと、forループは20回しか行われず弾を20発撃ちきったらもう出す弾が無くなるなんてことになりませんか??

Re: for文の使用

Posted: 2014年8月12日(火) 08:48
by Hiragi(GKUTH)
20発打ち切る前に玉が画面外に出て、フラグが折られるので20発打ち切ったら出す玉がなくなることはありません。

リンク先より
>発射する弾の数ですが、一画面中に何弾発射してればよいかという視点から考えます。
>画面中に20発以上の弾が溢れることはないので、20発定義しておけば弾切れもないと思うので、
>20発定義することにします。
>player.hではこの弾構造体を20個配列として定義しています。

のように書いてあります。そのfor文は今現在のフレームでフラグが立っていない(まだ打たれていない)玉を捜索して
フラグを立てる(打つ)意味を持っています。

Re: for文の使用

Posted: 2014年8月12日(火) 14:50
by kotori
そうなると、私が質問したfor文ではどうループしていることになるのでしょうか??

Re: for文の使用

Posted: 2014年8月12日(火) 15:03
by softya(ソフト屋)
kotoriさん がfor文の部分をどう見えているか説明してもらったほうが、ポイントで理由を説明しやすいかと思います。
ここの部分ですが、分かる所を説明してみてくださいね。

コード:

        for(int i=0;i<PSHOT_NUM;++i){
            if(shot[i].flag==false){
                shot[i].flag=true;
                shot[i].x=x;
                shot[i].y=y;
                break;
            }
        }

Re: for文の使用

Posted: 2014年8月12日(火) 15:20
by kotori

コード:

        for(int i=0;i<PSHOT_NUM;++i){
            if(shot[i].flag==false){
                shot[i].flag=true;
                shot[i].x=x;
                shot[i].y=y;
                break;
            }
        }
iを0で初期化し、それを19になるまでループします。そしてフラグが立っていない弾があればフラグを立てて発射位置をキャラの座標と同じにします。

Re: for文の使用

Posted: 2014年8月12日(火) 15:28
by softya(ソフト屋)
言葉が足らないですね。breakの説明が抜けています。

Re: for文の使用

Posted: 2014年8月12日(火) 15:38
by kotori
breakは処理がbreakまで到達したらfor{処理}から抜け出します。

Re: for文の使用

Posted: 2014年8月12日(火) 15:40
by softya(ソフト屋)
kotori さんが書きました:breakは処理がbreakまで到達したらfor{処理}から抜け出します。
と言うことは、どういう意味になるでしょうか?
20回ループしてますが、break;で抜けるのはどういう意図があったのでしょうか?

Re: for文の使用

Posted: 2014年8月12日(火) 15:58
by kotori
頓珍漢な回答かもしれませんが、20回のループの末に座標等の値を代入してbreakし、次の方の処理の弾の移動処理を行い、その弾が画面外に行ったらまたfalseの弾が生まれることになり、またfor文のループの処理を行うという。また、この時はbreakされた状態のためi=0から始められるということでしょうか?

Re: for文の使用

Posted: 2014年8月12日(火) 16:19
by softya(ソフト屋)
ポイントは1つの弾を生成したらbreakでループを抜けるって事ですね。
つまり、KEY_INPUT_Zを押したら弾が1つだけ生成されます。
20個の内どれが使用されるかは一番先に見つけたflagがfalseのものとなります。
最初のこのforループはキーを押された時のみの動作です。

2つ目のforループはflagが有効なものだけを処理します。
生存している弾でだけって事ですね。
弾を移動させて画面外に弾が出たらflagをfalseにしてこの弾は非生存とします。

どちらも弾の実際の表示はせず、弾の情報を書き換えるのみですぐにループを抜けて次の処理をしています。

Re: for文の使用

Posted: 2014年8月12日(火) 16:33
by kotori
ということはZを長押ししていたらその間は弾の生成→break→生成→break・・・をし続けているということでいいのでしょうか?

Re: for文の使用

Posted: 2014年8月12日(火) 16:40
by softya(ソフト屋)
弾の生成→break→生成→breakしませんよ。
プログラムの流れをみてください。ループ以外は必ず上から下に流れます。
[補足]
どのタイミングでbreak後に再びif(key[KEY_INPUT_Z]==1 && count%6==0){に戻ってきますか?

Re: for文の使用

Posted: 2014年8月12日(火) 16:46
by kotori
for文でbreakした時点ではないでしょうか?

Re: for文の使用

Posted: 2014年8月12日(火) 16:56
by softya(ソフト屋)
そんなはずはありません。ループ文の外なのに、どのループ文の影響を受けていると思いますか?

Re: for文の使用

Posted: 2014年8月12日(火) 17:04
by kotori

コード:

//画面の外にはみ出したらフラグを戻す
			if(shot[i].y<-10){
				shot[i].flag=false;
			}
ここですか?

Re: for文の使用

Posted: 2014年8月12日(火) 17:45
by softya(ソフト屋)
それは次の弾の生成には影響を受けますが、ループではありませんね。
その条件がいつ成立するかは状況次第です。
気になるんですが、一番最初に掲示されたプログラムで実行する順番に番号を振ってみてもらえませんか。

コード:

    if(key[KEY_INPUT_Z]==1 && count%6==0){ (1)
こんな感じで。これをちゃんと理解していないとプログラムを理解することが出来ません。