[2D]マウスカーソルと操作キャラを結んだ直線に対して、操作キャラを垂直に移動させ、”横移動”を表現したい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Takenoko_G
記事: 2
登録日時: 8年前
住所: 東京都

[2D]マウスカーソルと操作キャラを結んだ直線に対して、操作キャラを垂直に移動させ、”横移動”を表現したい。

#1

投稿記事 by Takenoko_G » 8年前

大晦日に失礼します。
10日ほど前からこのサイトを利用させていただいております。
初心者の無学な愚問かもしれませんが……

件名のように「マウスカーソルの方向を向いて前進、後退するキャラクターの横移動」を表現したいのです。
イメージとしてはマウスカーソル座標とキャラクター座標の間を結んだ線と、横移動したあとの座標によって
直角三角形を作って、その”底辺”を移動距離としてキャラクター座標を動かしたいのですが、

マウスカーソルとキャラクター座標、およびその角度がいくら変動しても、キャラクター座標との距離と方向を一定に保った点

を作る方法が、三日ほど悩み、数学のサイトもあれこれ見たのですが、
恥ずかしながら高校時代に数学を怠っていた私には思いつきません。
お知恵をお貸しいただければ幸いです。

以下、現状できている
マウスカーソル座標を中心点に、キャラクター座標までの距離を半径とした円上を移動することで、”横?移動”を表現したプログラム
を、拙いものですが、載せたいと思います。よろしくお願いします。

開発環境は
Windows 10/Microsoft C++/DXライブラリ

コード:

GetMousePoint(&m_x, &m_y);  //マウス座標取得
     pl_angle = (float)atan2(m_y - pl_y, m_x - pl_x);  //プレイヤーキャラクター座標の角度
		m_angle = (float)atan2(pl_y - m_y, pl_x - m_x);  //マウスカーソル座標の角度
		if (KeyGet(KEY_INPUT_W) >= 1) {  //前進の処理
			pl_x += cos(pl_angle) * 2;
			pl_y += sin(pl_angle) * 2;
			draw_pl_image = pl_image[count / 8 % 10];
		}
		else if (KeyGet(KEY_INPUT_S) >= 1) {  //後退の処理
			pl_x -= cos(pl_angle) * 2;
			pl_y -= sin(pl_angle) * 2;
			draw_pl_image = pl_image[count / 8 % 10];
		}
		else if (KeyGet(KEY_INPUT_D) >= 1) {  //左移動の処理
			if (KeyGet(KEY_INPUT_D) == 1) {   //キー入力時点での”円”を取得
				distance = sqrt(pow(pl_x - m_x, 2) + pow(pl_y - m_y, 2)); //ピタゴラスの定理
				d_m_x = m_x;
				d_m_y = m_y;
				d_m_angle = m_angle;
			}                 
			pl_x = d_m_x + (cos(d_m_angle -= PI / 180 * 0.5)*distance);  
			pl_y = d_m_y + (sin(d_m_angle -= PI / 180 * 0.5)*distance);
			draw_pl_image = pl_image[count / 8 % 10];
		}
		else if (KeyGet(KEY_INPUT_A) >= 1) {  //右移動の処理
			if (KeyGet(KEY_INPUT_A) == 1) {
				distance = sqrt(pow(pl_x - m_x, 2) + pow(pl_y - m_y, 2));
				d_m_x = m_x;
				d_m_y = m_y;
				d_m_angle = m_angle;
			}
			pl_x = d_m_x + (cos(d_m_angle += PI / 180 * 0.5)*distance);
			pl_y = d_m_y + (sin(d_m_angle += PI / 180 * 0.5)*distance);
			draw_pl_image = pl_image[count / 8 % 10];
		}
		else {
			立ち止まっている時の動作	
	}
大晦日でありますが、ご回答よろしくお願いします。

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

Re: [2D]マウスカーソルと操作キャラを結んだ直線に対して、操作キャラを垂直に移動させ、”横移動”を表現したい。

#2

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

>件名のように「マウスカーソルの方向を向いて前進、後退するキャラクターの横移動」を表現したいのです。
>イメージとしてはマウスカーソル座標とキャラクター座標の間を結んだ線と、横移動したあとの座標によって
>直角三角形を作って、その”底辺”を移動距離としてキャラクター座標を動かしたいのですが、

すいません。説明が良くわかりません。
三角形の底辺があると言うことは既に移動しているんじゃないでしょうか?
つまり、その後で移動距離という話が出てくるのか分からないです。

単純に横移動なら、キャラクタからマウスの点に向かうベクトルを持った単位ベクトルを右か左に90度回転させて、その回転した単位ベクトルに移動速度を掛ければ毎フレームごとの移動ベクトルは算出できます。この移動ベクトルに座標に足せば座標を移動させられます。
って話ではないかと思います。
円運動する必要はあるんでしょうか?

ゲームの場合は必須となる部分の数学ができないと行き詰まってしまいますので、そこだけは勉強して頂く必要があります。
全部が出来る必要はありません。ゲームに必要な部分だけです。

>マウスカーソルとキャラクター座標、およびその角度がいくら変動しても、キャラクター座標との距離と方向を一定に保った点
>を作る方法が、三日ほど悩み、数学のサイトもあれこれ見たのですが、

この説明だとキャラの横に別のものを置きたいとも読みとれますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takenoko_G
記事: 2
登録日時: 8年前
住所: 東京都

Re: [2D]マウスカーソルと操作キャラを結んだ直線に対して、操作キャラを垂直に移動させ、”横移動”を表現したい。

#3

投稿記事 by Takenoko_G » 8年前

すいません、返信ありがとうございます!

>単純に横移動なら、キャラクタからマウスの点に向かうベクトルを持った単位ベクトルを右か左に90度回転させて、その回転した単位ベクトルに移動速度を掛
>ければ毎フレームごとの移動ベクトルは算出できます。この移動ベクトルに座標に足せば座標を移動させられます。
>って話ではないかと思います。

申し訳ありません。
この処理の説明が上手くできず(どう考えればいいのかわからず)、ごちゃごちゃとした文章を並べてしまいました。

softyaさんの説明をもとに考えたら、一瞬で答えはでました。

単純にキャラクターとマウスカーソルの角度にPI*1.5,PI*0.5を足して、前進の処理させてやれば、私のさせたい動作ができました。

>ゲームの場合は必須となる部分の数学ができないと行き詰まってしまいますので、そこだけは勉強して頂く必要があります。
>全部が出来る必要はありません。ゲームに必要な部分だけです。

本当に簡単すぎる質問でした。お恥ずかしい。
以後このようなことがないように、しっかり勉強していきます。

>>マウスカーソルとキャラクター座標、およびその角度がいくら変動しても、キャラクター座標との距離と方向を一定に保った点
これは「算出したフレームごとの移動ベクトルに座標を足したところにある点」のことを言いたかったようです……

解決しました!ありがとうございました!

閉鎖

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