0

I am trying to make a game in which a cannons barrel is lifted or lowerd according to the cursor's position.

Here is the code I inserted inside the Barrel mc:

import flash.events.Event;
var hypotenuse,ratio,angleRad,angleDeg:Number;
stage.addEventListener(Event.ENTER_FRAME,spin);

function spin (e:Event):void{
    trace(mouseX+ " " + mouseY);
hypotenuse = Math.sqrt((mouseX)*(mouseX)+(mouseY)*(mouseY));
ratio = (Math.abs(mouseX))/hypotenuse;
angleRad = Math.asin(ratio);
angleDeg = angleRad*180/Math.PI;
if(mouseX >= 0 && mouseY <= 0 ){
    this.rotation = angleDeg;
}
if(mouseX >= 0 && mouseY > 0){
    this.rotation = (90-angleDeg)*2;
}
if(mouseX < 0 && mouseY > 0){
    this.rotation = angleDeg + 180;
}
if( mouseX < 0 && mouseY <= 0){
    this.rotation = (90-angleDeg)*2;
}
}

For some reason the barrel is just jerking around and not even in the direction where the mouse is at.. =/ I would love some advice or maybe a different coding suggestions this is a problem I'v been trying to solve for a while now and i dont know what i am doing wrong.

4

3 回答 3

1

就像其他 2 人所说,最好的方法是使用 atan2。既然你甚至追踪了结果,我的猜测是 mouseX 和 mouseY 给你相对于你的大炮的位置。

一旦假设,你可以打电话angleRad = atan2(mouseY, mouseX)

这将为您提供 0 和 Math.PI 之间的角度。degAngle = angleRad/Math.PI*180会以度数给出

从那里,您可以测试角度是否在 0 到 180 (mouseY>0) 之间,它会给出这样的结果:

if mouseY<0 then
    angleDeg-=180; //since rotation is optimized for -180<angle<180 afaik
end if
this.rotation = angleDeg;

抽搐可能是由于(90-angleDeg)*2它基本上转化为 180-2*angleDeg

编辑:您确定抖动不是由对象的 x/y 坐标基于旋转而变化引起的吗?你的对角线会比你的边大,所以旋转精灵可能会改变 X/Y,这将计算一个新的角度,这将使它旋转,这将使它变得混蛋。

在大多数情况下,您应该始终使用中心点(x+width/2 和 y+height/2)进行数学运算。

于 2013-05-31T12:58:17.327 回答
0

要获得两点之间的角度,请计算 x 和 y 距离

ydiff = y2 - y1
xdiff = x2 - x1

然后找到atan2ofydiffxdiff

Math.atan2(ydiff,xdiff)

砰!你刚刚得到点 1 和点 2 之间的角度。它可能以弧度为单位,所以先转换。

于 2013-05-31T09:02:06.170 回答
0

您必须找到地平线(默认:向东)与桶底和鼠标位置之间的线之间的角度。所以,首先你得到桶相对于一些不动和水平对齐的实体的位置(提示:舞台),然后你得到鼠标相对于舞台的位置,然后减去 Ys 和 Xs,调用Math.atan2()并将弧度转换为度数。应该做。代码来自桶内:

var barrelPoint:Point=this.LocalToGlobal(new Point());
var angle:Number=Math.atan2(e.stageY-barrelPoint.y,e.stageX-barrelPoint.x);
this.rotation=angle*180/math.PI;
于 2013-05-31T09:49:50.763 回答