GameMaker 日本語掲示板

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

4 コメント
views
17 フォロー

function movestart(moveway,obj)
{
show_debug_message(moveway);
var len = array_length_1d(moveway);
for(var i=0;i<len;i++){
if(moveway[i]=="right"){obj.x+=64;}
if(moveway[i]=="left"){obj.x-=64;}
if(moveway[i]=="down"){obj.y+=64;}
if(moveway[i]=="up"){obj.y-=64;}

}
}

この関数を改良して、滑らかにobjを動かせるようにしたいです。
どうすれば良いですか。

追記(6/16 22:23)
説明が足りていなかったため、付け足させていただきます。

objが64移動するのをmovewayの配列によって方向を決める関数なのですが,例えばmoveway=["left","left","down"]だった際,左に128,下に64行った地点に瞬間的に移動してしまいます。
そうではなく,左に64,少しの空き時間,左に64,少しの空き時間...というように,for文が繰り返されるたびに若干の空き時間をつくり、段階的に移動している様に見せたいです。

program_suck
作成: 2024/06/15 (土) 15:39:29
最終更新: 2024/06/16 (日) 22:23:30
通報 ...
1
生高橋 2024/06/16 (日) 18:38:48

この関数だとどんな問題があるのですか?

2
program_suck 2024/06/16 (日) 22:22:29 >> 1

説明を全くしておらず申し訳ないです。

objが64移動するのをmovewayの配列によって方向を決める関数なのですが,例えばmoveway=["left","left","down"]だった際,左に128,下に64行った地点に瞬間的に移動してしまいます。
そうではなく,左に64,少しの空き時間,左に64,少しの空き時間...というように,for文が繰り返されるたびに若干の空き時間をつくり、段階的に移動している様に見せたいです。

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);
}

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

4
program_suck 2024/06/18 (火) 09:12:28

ありがとうございます!
無事実行できました!