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 {
立ち止まっている時の動作
}