プレゼンハムを使ったシューティングゲームの敵弾処理
シューティングゲームで敵弾を移動させる時に、
普通に角度を使って移動させると、
一斉に同軸で重ねる事は出来ないので、
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に記しました。
この記事が気に入ったらサポートをしてみませんか?