Strafe一个点

时间:2012-06-07 14:19:01

标签: actionscript-3 math trigonometry

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

当用户按下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按钮,对象也会变得越来越明显 AWAY 从鼠标开始,好像被推开一样。

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

非常感谢任何见解!

1 个答案:

答案 0 :(得分: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));
}

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

我不得不做一些触发来得出正确的方程来获得正确的角度。该角度取决于运动弧的半径,因为较大的半径但是恒定的角度会增加运动距离(不希望的行为)。我之前的解决方案(在编辑之前)是通过半径缩放角度,但是这仍然会导致更大的半径移动。

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