我决定在这里提问,因为我有我认为自己无法解决的问题。 我正在尝试制作 RPG 的 2D 游戏,你到处跑,做点什么。
为此我需要知道哪个方向玩家正在寻找,玩家是ofc。朝鼠标的方向看,我做了一个功能,它......有点工作但不总是,当相机 XY 设置为 0,0 角度计算时正确。但是一旦我将相机从 0,0 移开,它的行为就会变得很奇怪,我会分别移动播放器和相机(以防我需要过场动画)
这是我当前的代码,显示从玩家位置到鼠标位置的 140 像素长的线
qAngle = qGetAngle2( // Angle between 2 points ( Player Position + Camera )
qVec2d{qMouse.x+Camera.x,qMouse.y+Camera.y}, // Mouse + Camera XY
qVec2d{Shelly.x+Camera.x,Shelly.y+Camera.y});// Player + Camera XY
Angle = qAngle; // only converting Int to StringInt for debug display
ShellyWindow.qDraw_Line( // Drawing line
Shelly.x+Camera.x, // Player X + Camera ( start point X )
Shelly.y+Camera.y, // Player Y + Camera ( start point Y )
(sin( 0.01744 * qAngle )*140)+(Camera.x+Shelly.x), // End point X
(cos( 0.01744 * qAngle )*140)+(Camera.y+Shelly.y), // End point Y
0x00FF00 ); // color
我不知道我该怎么办...从我的角度来看,逻辑是 100% 好的
只要我不在任何地方移动相机,上面的代码就可以工作...... 这就是我移动东西的方式,XS 表示“速度”,X/Y 只是位置
// moving player XY Speed
if( qKey_a.Push )Shelly.xs -= 0.11;
if( qKey_d.Push )Shelly.xs += 0.11;
if( qKey_w.Push )Shelly.ys -= 0.11;
if( qKey_s.Push )Shelly.ys += 0.11;
// Moving Camera XY position
if( qKey_f.Push )Camera.x += 5;
if( qKey_h.Push )Camera.x -= 5;
if( qKey_t.Push )Camera.y += 5;
if( qKey_g.Push )Camera.y -= 5;
我不知道我可以尝试让它发挥作用, 我只是在尝试使用不同的参数来提供函数。
//Edit1:我在这里添加了两张图片:
标准库提供atan2。它返回从正 x 轴到笛卡尔坐标中的点的最短弧度角。
由于点是相对于原点的,所以需要转换坐标系。听起来很可怕,但在非旋转的 2D 坐标中,你只需要减去你的参考点。
下面的代码会给你雪莉到鼠标指针的角度:
constexpr auto r2d = 180. / M_PI;
qAngle = r2d * std::atan2(Shelly.y - qMouse.y, Shelly.x - qMouse.x);