这似乎是一个简单的触发问题,但无论出于何种原因,事情都没有成功。
当用户按下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 从鼠标开始,好像被推开一样。
我不知道为什么会这样,以及如何解决它。
非常感谢任何见解!
答案 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
的情况下应用相同的原则。
我不得不做一些触发来得出正确的方程来获得正确的角度。该角度取决于运动弧的半径,因为较大的半径但是恒定的角度会增加运动距离(不希望的行为)。我之前的解决方案(在编辑之前)是通过半径缩放角度,但是这仍然会导致更大的半径移动。
目前的方法确保在所有情况下半径和速度保持不变。