GameMaker 日本語掲示板

この関数の改善法について / 3

4 コメント
views
16 フォロー
3
生高橋 2024/06/17 (月) 22:23:03 >> 2

了解です。

これを一つに関数にするのはとても難しいと思いますのでオブジェクトで一旦サンプルをつくってみました。
説明しやすいようかなり助長に書いたのでお好きに改善してもらえたらと思います。

CreateEvent

moveway = ["right","down","left","up"];//移動方向の指定
moveSpd = 1;//移動速度
moveDistance = 64;//移動距離
targetX = 0;//目的地のx座標
targetY = 0;//目的のy座標
isMove = 0;//移動中かどうか

StepEvent

//停止中の状態
if(isMove == false)
{
	 //配列の中身があるか
	if(array_length(moveway) > 0)
	{
		//配列の先頭を取得
		var dir = array_first(moveway);
		
		//方向によって目的の座標を決定
		if(dir == "right")
		{
			targetX = x + moveDistance;
			targetY = y;
		}
		else if(dir == "left")
		{
			targetX = x - moveDistance;
			targetY = y;
		}
		else if(dir == "down")
		{
			targetX = x;
			targetY = y + moveDistance;
		}
		else if(dir == "up")
		{
			targetX = x;
			targetY = y - moveDistance;
		}
		
		//先頭の配列を削除
		array_delete(moveway,0,1);
		
		//移動中に設定
		isMove = true;
	}
}

//移動中の状態
if(isMove == true)
{
	//指定した位置まで移動
	x = approach(x, targetX, moveSpd);
	y = approach(y, targetY, moveSpd);
	
	//到着したら移動停止
	if(x == targetX && y == targetY)
	{
		isMove = false;
	}
}

まず移動中と停止中で状態を分けました。
・停止中は配列に値があるか確認して、ある場合はその値を確認して目的座標を決定、移動中にします。
・移動中は目的座標まで移動し、到着したら停止中にします。
以上を配列がなくなるまで繰り返すことで実現しています。
移動させたい場合は配列に方向の文字列を入れればいつでも先頭の順番で移動します。

ここではapproachという目的の数値まで一定の値で加算させるGameMakerではかなり有名な自作関数を使っています。
中身は次の通りです。

function approach(a,b,c)
{
	return a < b ? min(a + c,b) : max(a - c,b);
}

わからないことがあれば聞いてください。

通報 ...