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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Teno

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

#1

投稿記事 by Teno » 12年前

移動するキーを離した時、すぐに停止しないで滑るような処理を作りたいと思っています。
色々試してみたのですが、特に斜め移動の後に滑る場合の計算がどうしても思いつきませんでした。
以下が移動するときの処理です。

コード:

	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);
こうすればいい、こんな方法がある、など教えていただけないでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

移動ベクトルで移動速度を保持すれば、慣性のある動きに出来ますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Teno

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

#3

投稿記事 by Teno » 12年前

回答ありがとうございます!
"移動速度"をヒントに自分なりに組んでみた結果、最初に貼ったソースとはかなり違いますが実装できました。

コード:

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


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

閉鎖

“C言語何でも質問掲示板” へ戻る