ブロック崩し

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

ブロック崩し

#1

投稿記事 by ヨシタケ » 12年前

お久しぶりです。
ブロック崩しのステージを2-3面まで増やしました。
ステージ2ではバーの移動範囲をベルトコンベアのようにしてあるのと
ブロックを一定の条件で動くようにしました。

2-3面にボスを設定したのですがボスの攻撃で左右にモノを投げるというような攻撃をするようにしています。
投げたモノが壁に反射するようにしたいのですがうまく反射してくれません。
最初は構造体shot[0](左側)とshot[1](右側)で反射するshot[].xの位置、x軸方向の速さshot[].dxが異なるので

コード:

	if(shot[0].flag == TRUE){
		shot[0].x += shot[0].dx;
		shot[0].dy +=accel;
		shot[0].y +=shot[0].dy;

		if(shot[0].x <30)
			shot[0].dx *= -1;
		if(shot[0].y >450){
			shot[0].dx = -1;shot[0].dy = 1;
			shot[0].flag = FALSE;
			shot[0].x = 0;shot[0].y = 0;
		}
	}
	if(shot[1].flag == TRUE){
		shot[1].x += shot[1].dx;
		shot[1].dy +=accel;
		shot[1].y +=shot[1].dy;

		if(shot[1].x >400)
			shot[1].dx *=-1;

		if(shot[1].y>450){
			shot[1].dx = 1;shot[1].dy = 1;
			shot[1].flag = FALSE;
			shot[1].x = 0;shot[1].y = 0;
		}
	}
にして、こちらの場合は反射してくれます。しかし、長いので少しでも短くしようと思い,

コード:

	for(l = 0;l<2;l++){
		if(shot[l].flag == TRUE){
			shot[l].cnt++;
			shot[l].x  += shot[l].dx;
			shot[l].dy += accel;
			shot[l].y  += shot[l].dy;
			if(shot[0].x <30)
				shot[0].dx *=-1;
			if(shot[1].x >400)
				shot[1].dx *=-1;
			if(shot[l].y >450){
				shot[l].dx = -1*pow(-1.0,l);shot[l].dy = 1;
				shot[l].flag = FALSE;
				shot[l].x = 0;shot[l].y = 0;
			}
		}
	}
というように変えたら反射しなくなりました。
また、たまに左右に投げるモノが2つとも同じ方向(右側)に投げます。
正直、どうすればよいのかわからなかったので質問させていただきました。

データは下記のサイトにアップしてあります。パスワードは「YT2013」です。
http://www1.axfc.net/uploader/so/2848394

よろしくお願いします。

アバター
雨ガエル
記事: 34
登録日時: 13年前
住所: 新潟
連絡を取る:

Re: ブロック崩し

#2

投稿記事 by 雨ガエル » 12年前

確認していませんが、上と下のコードでは、違いがあります。
下のコードでは、

コード:

if(shot[0].x <30)
    shot[0].dx *=-1;
if(shot[1].x >400)
    shot[1].dx *=-1;
のチェックを2回行っています。
上のコードのような動作にするには、

コード:

if(i==0)
{
    if(shot[0].x <30)
        shot[0].dx *=-1;
}
else if(i==1)
{
    if(shot[1].x >400)
        shot[1].dx *=-1;
}
のようにすればいいと思います。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: ブロック崩し

#3

投稿記事 by ISLe » 12年前

コード:

    for(l = 0;l<2;l++){
        if(shot[l].flag == TRUE){
            shot[l].cnt++;
            shot[l].x  += shot[l].dx;
            shot[l].dy += accel;
            shot[l].y  += shot[l].dy;
            if((shot[l].dx < 0 && shot[l].x <30)
             ||(shot[l].dx > 0 && shot[1].x >400))
                shot[1].dx *=-1;
            if(shot[l].y >450){
                shot[l].dx = l*2-1;shot[l].dy = 1; /* ※ */
                shot[l].flag = FALSE;
                shot[l].x = 0;shot[l].y = 0; /* ※ */
            }
        }
    }
この条件式なら同じ方向に2発も狙ってできます。
初期設定(※付けた箇所)は発射時に行うほうが応用が効くと思います。

ヨシタケ

Re: ブロック崩し

#4

投稿記事 by ヨシタケ » 12年前

頂いたアドバイスの通り直したところ

ちゃんと壁で反射するようになり、同じ方向に飛んでくことがなくなりました。

ありがとうございました。

閉鎖

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