ページ 11

慣性?のあるキーを離した後に滑る移動処理について

Posted: 2013年12月23日(月) 17:16
by Teno
移動するキーを離した時、すぐに停止しないで滑るような処理を作りたいと思っています。
色々試してみたのですが、特に斜め移動の後に滑る場合の計算がどうしても思いつきませんでした。
以下が移動するときの処理です。

コード:

	struct XY{
		float x;
		float y;
	};
	//プレイヤーの座標
	XY model = {320,240};
	//正面の角度(実際に組み込む時はマウスの座標から角度を変更します)
	float angle = PI;

	/*メインループ*/
	//移動量
	XY move = {0};
	//入力キー(右,上,左,下)
	const int moveKey[4] = {D_DIK_D,D_DIK_W,D_DIK_A,D_DIK_S};
	//移動したかどうか
	bool moveFlag;
	//キーが押されているか確認
	for(int i = 0;i < 4;i ++){
		//指定したキーが押されていたら0以上の値が戻ってくる
		if(CheckKey(moveKey[i]) > 0){
			moveFlag = true;
			//角度を計算するため、とりあえず移動する
			move.x += sin(-angle - PI / 2 + PI / 2 * i);
			move.y += cos(-angle - PI / 2 + PI / 2 * i);
		}
	}
	//移動していた場合は
	if(moveFlag){
		//移動した後の角度を調べる
		float angle2 = atan2(move.x,move.y);
		//10px移動する
		move.x += sin(angle2) * 10;
		move.y += cos(angle2) * 10;
	}
	//移動する
	model.x += move.x;
	model.y += move.y;
	//画像を表示して確認
	DrawRotaGraphF(model.x,model.y,1,0,img,true);
こうすればいい、こんな方法がある、など教えていただけないでしょうか。

Re: 慣性?のあるキーを離した後に滑る移動処理について

Posted: 2013年12月23日(月) 19:02
by softya(ソフト屋)
移動ベクトルで移動速度を保持すれば、慣性のある動きに出来ますよ。

Re: 慣性?のあるキーを離した後に滑る移動処理について

Posted: 2013年12月23日(月) 21:13
by Teno
回答ありがとうございます!
"移動速度"をヒントに自分なりに組んでみた結果、最初に貼ったソースとはかなり違いますが実装できました。

コード:

		static VECTOR model = {320,0,240};
		VECTOR move = {0};
		static VECTOR slip = {0};
		float speed = 1.0f;
		if(CheckKey(KEY_INPUT_A) > 0 || CheckKey(KEY_INPUT_D) > 0){
			if(CheckKey(KEY_INPUT_W) > 0 || CheckKey(KEY_INPUT_S) > 0){
				speed = slant;
			}
		}
		speed = 5 * speed;
		if(CheckKey(KEY_INPUT_A) > 0)	move.x -= speed;
		if(CheckKey(KEY_INPUT_D) > 0)	move.x += speed;
		if(CheckKey(KEY_INPUT_W) > 0)	move.z -= speed;
		if(CheckKey(KEY_INPUT_S) > 0)	move.z += speed;
		if(move.x != 0 || move.z != 0) slip = move;
		move.x = (move.x + slip.x) / 2;
		move.z = (move.z + slip.z) / 2;
		//角度
		float angle = 0;
		MATRIX spin = MGetRotY(angle);
		move = VTransform(move,spin);
		model.x += move.x;
		model.z += move.z;
		slip = VScale(slip,0.9f);
		DrawRotaGraphF(model.x,model.z,1,0,img,true);


目標通りのプログラムを作ることができたので解決とさせていただきます。
ありがとうございました!