プレゼンハムを使ったシューティングゲームの敵弾処理

シューティングゲームで敵弾を移動させる時に、
普通に角度を使って移動させると、
一斉に同軸で重ねる事は出来ないので、
x方向の移動方向は同じで、
yだけ異なるようにしたいので、
プレゼンハムを使って試す事にした。
GameMakerを使って、
作成開始から20分で作成したのが以下です。

function scr_eshot_step_Bresenham(){

switch(state)
{
	case 0:	//	初期設定を行う。
		image_angle = point_direction(x,y,tar.x,tar.y)
		base_speed = int64(speed);
		speed = 0 ;
		xpos = x - tar.x;
		ypos = y - tar.y;
		var i = xpos;
		var j = ypos;
		if( i < 0 )i = -i;
		if( j < 0 )j = -j;

		if( i >= j )
		{
			if( xpos >= 0 )
			{
				if( ypos >= 0 )state = 1;		//	--
				else state = 2;					//	-+
			}
			else
			{
				if( ypos >= 0 )state = 3;		//	+-
				else state = 4;					//	++
			}
		}
		else
		{
			if( xpos >= 0 )
			{
				if( ypos >= 0 )state = 5;		//	--
				else state = 6;					//	-+
			}
			else
			{
				if( ypos >= 0 )state = 7;		//	+-
				else state = 8;					//	++
			}
		}
		if( xpos < 0 )xpos = -xpos;
		if( ypos < 0 )ypos = -ypos;
		xmov = xpos;
		ymov = ypos;
	break;
	case 1:
		repeat(base_speed)
		{
			x--;
			xmov -= ymov;
			while( xmov <= 0 )
			{
				xmov += xpos;
				y--;
			}
		}
	break;
	case 2:
		repeat(base_speed)
		{
			x--;
			xmov -= ymov;
			while( xmov <= 0 )
			{
				xmov += xpos;
				y++;
			}
		}
	break;
	case 3:
		repeat(base_speed)
		{
			x++;
			xmov -= ymov;
			while( xmov <= 0 )
			{
				xmov += xpos;
				y--;
			}
		}
	break;
	case 4:
		repeat(base_speed)
		{
			x++;
			xmov -= ymov;
			while( xmov <= 0 )
			{
				xmov += xpos;
				y++;
			}
		}
	break;
	//	yが基準。
	case 5:
		repeat(base_speed)
		{
			y--;
			ymov -= xmov;
			while( ymov <= 0 )
			{
				ymov += ypos;
				x--;
			}
		}
	break;
	case 6:
		repeat(base_speed)
		{
			y++;
			ymov -= xmov;
			while( ymov <= 0 )
			{
				ymov += ypos;
				x--;
			}
		}
	break;
	case 7:
		repeat(base_speed)
		{
			y--;
			ymov -= xmov;
			while( ymov <= 0 )
			{
				ymov += ypos;
				x++;
			}
		}
	break;
	case 8:
		repeat(base_speed)
		{
			y++;
			ymov -= xmov;
			while( ymov <= 0 )
			{
				ymov += ypos;
				x++;
			}
		}
	break;
}

}

変数については、GameMakerを使用している方は分かると思いますが、
オブジェクトの変数として、
base_speed (speedはその数値で移動してしまうので、0にした上で、別の変数を使用する。)
xpos
ypos
xmov
ymov
tar (ターゲットにしている敵のオブジェクトを示す)
を定義して使用していますが、
もっと効率的にも出来ると思います。


個人的に忘れない為のメモとして記録する為にnoteに記しました。

この記事が気に入ったらサポートをしてみませんか?