在 2D 游戏中获取两点之间的角度,移动相机时出现问题

问题描述 投票:0回答:1

我决定在这里提问,因为我有我认为自己无法解决的问题。 我正在尝试制作 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:我在这里添加了两张图片:

When Camera is in its 0,0 Coords

When i move Camera

c++ game-engine game-development angle
1个回答
0
投票

标准库提供atan2。它返回从正 x 轴到笛卡尔坐标中的点的最短弧度角。

由于点是相对于原点的,所以需要转换坐标系。听起来很可怕,但在非旋转的 2D 坐标中,你只需要减去你的参考点。

下面的代码会给你雪莉到鼠标指针的角度:

constexpr auto r2d = 180. / M_PI;
qAngle = r2d * std::atan2(Shelly.y - qMouse.y, Shelly.x - qMouse.x);
© www.soinside.com 2019 - 2024. All rights reserved.