1

这似乎是一个简单的触发问题,但无论出于何种原因,事情都没有解决。

我试图简单地让一个对象在用户按下 A/D 键时围绕给定点旋转(以圆周运动在鼠标周围扫射,同时仍面向鼠标)。

这是我到目前为止尝试过的代码(所有数学函数都采用并返回弧度):

if (_inputRef.isKeyDown(GameData.KEY_LEFT))
{
    x += 2 * Math.cos(Math.atan2(mouseY - y, mouseX - x) - Math.PI * 0.5);
    y += 2 * Math.sin(Math.atan2(mouseY - y, mouseX - x) - Math.PI * 0.5);
}
else if (_inputRef.isKeyDown(GameData.KEY_RIGHT))
{
    x += 2 * Math.cos(Math.atan2(mouseY - y, mouseX - x) + Math.PI * 0.5);
    y += 2 * Math.sin(Math.atan2(mouseY - y, mouseX - x) + Math.PI * 0.5);
}

还有一个更优雅的方法可以完成同样的事情:

if (_inputRef.isKeyDown(GameData.KEY_LEFT))
{
    x += 2 * Math.sin(Math.atan2(mouseY - y, mouseX - x));
    y -= 2 * Math.cos(Math.atan2(mouseY - y, mouseX - x));
}
else if (_inputRef.isKeyDown(GameData.KEY_RIGHT))
{
    x -= 2 * Math.sin(Math.atan2(mouseY - y, mouseX - x));
    y += 2 * Math.cos(Math.atan2(mouseY - y, mouseX - x));
}

现在,它们都起作用了,对象围绕鼠标旋转,同时始终面向鼠标,但是如果有足够的时间按住 strafe 按钮,对象也在远离鼠标旋转变得越来越明显,就好像它是推开。

我不知道为什么会这样以及如何解决它。

任何见解表示赞赏!

4

1 回答 1

1

我认为你目前的方法只有在你采取“无限小”的步骤时才会奏效。就像现在一样,每次移动都垂直于“到鼠标矢量”,从而增加了鼠标和对象之间的距离。

一种解决方案是通过围绕鼠标旋转位置来计算新位置,同时保持与鼠标的距离不变:

// position relative to mouse
var position:Point = new Point(
    x - mouseX,
    y - mouseY);

var r:Number = position.length; // distance to mouse

// get rotation angle around mouse that moves
// us "SPEED" unit in world space
var a:Number = 0;
if (/* LEFT  PRESSED */) a = getRotationAngle( SPEED, r);
if (/* RIGHT PRESSED */) a = getRotationAngle(-SPEED, r);
if (a > 0) {

    // rotate position around mouse
    var rotation:Matrix = new Matrix();
    rotation.rotate(a);
    position = rotation.transformPoint(position);
    position.offset(mouseX, mouseY);

    x = position.x;
    y = position.y;
}

// elsewhere...

// speed is the distance to cover in world space, in a straight line.
// radius is the distance from the unit to the mouse, when rotating.
private static function getRotationAngle(speed:Number, radius:Number):Number {
    return 2 * Math.asin(speed / (2 * radius));
}

上面使用 a围绕鼠标位置Matrix旋转(x, y)位置。当然,如果需要,您可以在不使用的情况下应用相同的原理Matrix

我必须做一些三角操作才能得出正确的方程式来获得正确的角度。该角度取决于运动弧的半径,因为较大的半径但恒定的角度会增加运动距离(不良行为)。我早期的解决方案(在编辑之前)是按半径缩放角度,但这仍然会导致半径较大的运动稍微多一些。

当前的方法确保半径和速度在所有情况下都保持不变。

于 2012-06-07T14:56:57.487 回答