ページ 11

ブロック崩し

Posted: 2009年4月08日(水) 15:46
by ふぁんとむ
テキスト本を一冊終え、コチラの龍神録を半分ほど進めたところで、一旦区切りを付けて現在VC++2008で『ブロック崩し』を1から作成しています
方々を参考に何とか三角関数を利用してボールの角度を算出することに成功したので、ボールの発射角度を主導で変化させられるようにしようと、変更を加えているところなのですが、その際にビリヤードゲームのように軌道予測を表示させようと四苦八苦しています
ボールの角度変更そのものは問題なく動作するのですが、予測角度の方が自機に当たったら跳ね返るように表示したいのですが、どうやっても自機を素通りしてしまいます
void ball_move()
{
	double x1, x2, y1, y2;

	//画面枠との当たり判定
	if (ball.x>FMX-8 || ball.x<FX+3)
	{
		se_flag[0]=1;
		ball.mx*=(-1);
	}
	if (ball.y>FMY-8 || ball.y<FY+3)
	{
		se_flag[0]=1;
		ball.my*=(-1);
	}
	if (ball.x>rod.x && ball.x<rod.x+rod.cnt*8 && ball.y+8>RY && ball.y<RY+4)
	{
		se_flag[0]=1;
		ball.my=ball.my*(-1);
	}

	//ブロックとの当たり判定
	for (int y=0; y<BMY; y++)
	{
		for (int x=0; x<BMX; x++)
		{
			x1=block[y][x].x-16;	x2=block[y][x].x+16;
			y1=block[y][x].y-8;		y2=block[y][x].y+8;
			if (block[y][x].flag>0)
			{
				//ブロック左右判定
				if (x1<ball.x && x2>ball.x && ball.y>y1 && ball.y<y2)
				{
					ball.mx*=-1;
					if (block[y][x].power<10)
					{
						block[y][x].power--;
						if (block[y][x].power<1)
						{
							block[y][x].flag=0;
							se_flag[2]=1;
						} else {
							se_flag[1]=1;
							SetDrawBlendMode(DX_BLENDMODE_MUL,0);
							DrawBox(x1, y1, x2, y2, GetColor(191, 191, 191),TRUE);
							SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
						}
					} else	se_flag[1]=1;
					break;
				}
				//ブロック上下判定
				if (ball.x>x1 && ball.x<x2 && ball.y+4>y1 && ball.y-4<y2)
				{
					ball.my*=-1;
					if (block[y][x].power<10)
					{
						block[y][x].power--;
						if (block[y][x].power<1)
						{
							block[y][x].flag=0;
							se_flag[2]=1;
						} else {
							se_flag[1]=1;
							SetDrawBlendMode(DX_BLENDMODE_MUL,0);
							DrawBox(x1, y1, x2, y2, GetColor(191, 191, 191),TRUE);
							SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
						}
					} else	se_flag[1]=1;
				}
			}
		}
	}

	//移動計算
	if (ball.flag>0)
	{
		ball.x+=fcos[ball.angle]*ball.mx*ball.speed;
		ball.y+=fsin[ball.angle]*ball.my*ball.speed;
	//待機処理
	} else {
		//上が押されたら発射方向を右へ
		if (CheckStatePad(configpad.up)>0)
		{
			ball.angle+=2;
			if(ball.angle>=310)	ball.angle=310;
		}
		//下が押されたら発射方向を左へ
		if (CheckStatePad(configpad.down)>0)
		{
			ball.angle-=2;
			if(ball.angle<=45)	ball.angle=45;
		}

		//軌道予測
		shot.cnt++;
		if (shot.cnt%50==0)
		{
			shot.x	=ball.x;
			shot.y	=ball.y;
			shot.my	=ball.my;
		}

		if (shot.x>rod.x && shot.x<rod.x+rod.cnt*8 && shot.y+8>RY && shot.y<RY+4)
		{
			shot.my=shot.my*(-1);
		}

		//予測軌道の表示
		shot.x+=fcos[ball.angle]*ball.mx;
		shot.y+=fsin[ball.angle]*ball.my;

		//発射ボタンが押されたら、発射
		if (CheckStatePad(configpad.shot)>0)
		{
			ball.flag=1;
			shot.flag=0;
		}
		//ボールの待機位置
		ball.x=fcos[ball.angle]+(rod.x+(rod.cnt*8)/2);

		//ball.x=rod.x+(rod.cnt*8)/2;
	}
}

void first_ini()
{
	stage_count		=1;

	configpad.down	=0;
	configpad.left	=1;
	configpad.right	=2;
	configpad.up	=3;
	configpad.shot	=4;
	configpad.jump	=5;
	configpad.change=6;
	configpad.start	=13;

	rod.x		=FMX/2-16;
	rod.speed	=4;
	rod.cnt		=6;

	for(int i=0; i<360; i++)
	{
		fsin=(float)sin(i*PI/360);
		fcos=(float)cos(i*PI/360);
	}

	ball.flag	=0;
	ball.speed	=3;
	ball.angle	=45;
	ball.x		=rod.x+(rod.cnt*8)/2;
	ball.y		=RY-16;
	ball.mx		=cos(ball.angle*PI);
	ball.my		=sin(ball.angle*PI/2);

	shot.x		=ball.x;
	shot.y		=ball.y;
	shot.my		=ball.my;
	shot.flag	=1;
	shot.cnt	=0;
}


現在の問題点としては…

・予測軌道が上手く表示されない
//予測軌道の表示
shot.x+=fcos[ball.angle]*ball.mx;
shot.y+=fsin[ball.angle]*ball.my;
のところを
//予測軌道の表示
shot.x+=fcos[ball.angle]*ball.mx;
shot.y+=fsin[ball.angle]*shot.my;
と変更すると、表示角度が水平になってしまったりしまいます

・ボールがたまにありえない動きをする
ブロックは画像幅で当たり判定を取っているのに対し、ボールはDrawRotaGraphFの表示位置で当たり判定をとっているせいか、ブロックの角に当たってブロックを2つ消して同じ軌道を戻ってしまったり、ブロックを上下にジグザグ移動しながら水平にブロックを消しながら進んだりする

当面、問題がありそうな部分をコピペしておきましたが、プロジェクトそのものを添付しておいた方がよいでしょうか?
http://www1.axfc.net/uploader/H/so/74134
DL PASS:block
↑にプロジェクトを上げさせていただきました
お力添えいただきますようお願いしますm(__)m

Re:ブロック崩し

Posted: 2009年4月08日(水) 16:12
by toyo
プロジェクト丸ごとあったほうが実際に動作させて確認できるのでわかりやすいと思います
とりあえず
fsin=(float)sin(i*PI/360);

fsin=(float)sin(i*2*PI/360);
ではないでしょうか
floatならsinf( )やcosf( )という関数もありますが中身は(float)sin( )のマクロだったりするので結局一緒ですかね

Re:ブロック崩し

Posted: 2009年4月08日(水) 16:25
by ふぁんとむ
了解しました
プロジェクトを丸ごと添付させていただきます

http://www1.axfc.net/uploader/H/so/74134
DL PASS:block
↑にプロジェクトを上げさせていただきました