Actionscript 3 带旋转炮塔AS3的坦克

Actionscript 3 带旋转炮塔AS3的坦克,actionscript-3,actionscript,trigonometry,flash-cs3,Actionscript 3,Actionscript,Trigonometry,Flash Cs3,我正在制作一个战舰模拟器,用WASD键控制战舰,用鼠标指针控制炮塔。炮塔可以360度移动 它应该怎么旋转就怎么旋转;然而,每当鼠标指针使炮塔达到0或360度的角度时,它就会开始无休止地旋转,直到我将鼠标指针移回另一个角度 附件是我到目前为止关于炮塔移动的代码: var PTurret1angle:Number = 270; function PTurretRotate(Evt:Event){ var Turret1x:Number; var Turret1y:Number; var Turr

我正在制作一个战舰模拟器,用WASD键控制战舰,用鼠标指针控制炮塔。炮塔可以360度移动

它应该怎么旋转就怎么旋转;然而,每当鼠标指针使炮塔达到0或360度的角度时,它就会开始无休止地旋转,直到我将鼠标指针移回另一个角度

附件是我到目前为止关于炮塔移动的代码:

var PTurret1angle:Number = 270;

function PTurretRotate(Evt:Event){

var Turret1x:Number;
var Turret1y:Number;
var Turret1Angle:Number;

Turret1x = mvi_PTurret1.x - mouseX;
Turret1y = mvi_PTurret1.y - mouseY;

Turret1Angle = Math.round(Math.atan2(Turret1y,Turret1x) * (180/Math.PI) + 180);

if(Turret1Angle > PTurret1angle){
    mvi_PTurret1.rotation += 1;
    PTurret1angle += 1;
    if(PTurret1angle == 360){
        PTurret1angle = 0;
    }
}
else if(Turret1Angle < PTurret1angle){
    mvi_PTurret1.rotation -= 1;
    PTurret1angle -= 1;
    if(PTurret1angle == 0){
        PTurret1angle = 360;
    }
}


txt_Turret1Angle.text = Turret1Angle.toString();
txt_PTurret.text = PTurret1angle.toString();
}
因此,我的两个问题是:

1无论鼠标指针的位置如何,如何确保转台始终锁定在鼠标指针所在的位置

2有没有办法使轮换更有效?例如,如果我的指针要求炮塔只旋转30度左右,它实际上会根据具体情况旋转330度


感谢您的帮助。

您的炮塔角度非常时髦,因为这两个if语句:

if(PTurret1angle == 0){
    PTurret1angle = 360;
}

它们让你的鼠标在顶部无限旋转,角度为零,角度设置为360,大于零,你减去一,哦,伙计,现在是359,大于零,必须一路旋转,哦,伙计,我们到了零,必须设置为360,……等等

您可以通过检查转塔1角度和pturret1角度之间的差异来实现高效旋转。以下是我的假设:

零指向正上方。 正旋转是顺时针旋转。 炮塔1角度是鼠标角度,pturret1角度是实际的当前炮塔角度 你最想转弯的地方就是180度。合理轮作 这就是说,您可以根据两件事来确定转向的方式:炮塔1角度鼠标角度和pturret1角度实际炮塔角度之间差异的符号,以及这种差异的大小。我这是什么意思

使用转塔1角鼠标的示例-pturret1角实际值:

鼠标在1度,炮塔在359度。鼠标-炮塔=-358。您最想旋转的角度是180度,因此,由于abs-358>180,因此,如果差值为负值,则添加360度。这给你+2,这意味着顺时针转动2度! 鼠标在359,炮塔在1。鼠标-炮塔=358。abs358>180,因此减去360度,因为差值为正值。这给你-2,所以逆时针转2度! 鼠标在1,炮塔在3。鼠标-炮塔=-2。由于abs-2<180,我们不需要增加360度,只需逆时针转动2度即可! 我对我的动作脚本有点生疏了,所以我不会真正为你编写代码。我想我已经详细地解释了如何实现您询问的两个修复程序,但是如果您有任何问题,我很乐意对其进行伪编码

编辑:以下是一些伪代码:

var AngleDiff:Number;

// starting after declarations/getting basic information, within your function

Turret1Angle = Math.round(Math.atan2(Turret1y,Turret1x) * (180/Math.PI) + 180);
AngleDiff = Turret1Angle - PTurret1angle;

if(Math.abs(AngleDiff) > 180){  // efficient movement
    if(AngleDiff > 0){
        AngleDiff -= 360;
    }else if(AngleDiff < 0){
        AngleDiff += 360;
}

if(AngleDiff > 0){  //  do the actual movement
    PTurret1Angle += 1;
    mvi_PTurret1.rotation += 1;
}else if(AngleDiff < 0){
    PTurret1Angle -= 1;
    mvi_PTurret1.rotation -= 1;
}

注意:这是比伪代码更真实的代码。不过我还没有实际测试过,所以它可能/可能不起作用

谢谢你的回复!炮塔不再在0度角被卡住,这太棒了。然而,我仍然有一点点的麻烦与有效的旋转。我能接受你提供的伪编码吗?我刚刚接触as3,不太擅长编程,所以我真的需要外部指导,直到我能掌握自己的能力。为什么不简单地使用%360来包装360以上的内容呢?
var AngleDiff:Number;

// starting after declarations/getting basic information, within your function

Turret1Angle = Math.round(Math.atan2(Turret1y,Turret1x) * (180/Math.PI) + 180);
AngleDiff = Turret1Angle - PTurret1angle;

if(Math.abs(AngleDiff) > 180){  // efficient movement
    if(AngleDiff > 0){
        AngleDiff -= 360;
    }else if(AngleDiff < 0){
        AngleDiff += 360;
}

if(AngleDiff > 0){  //  do the actual movement
    PTurret1Angle += 1;
    mvi_PTurret1.rotation += 1;
}else if(AngleDiff < 0){
    PTurret1Angle -= 1;
    mvi_PTurret1.rotation -= 1;
}
PTurret1Angle = PTurret1Angle % 360;