使对象根据光标位置旋转

时间:2013-05-31 08:59:56

标签: actionscript-3

我正在尝试根据光标的位置制作一个加高或降低大炮筒的游戏。

以下是我在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;
}
}

出于某种原因,枪管只是在左右摇晃,甚至没有鼠标所在的方向.. = /我会喜欢一些建议或者可能是不同的编码建议 这是一个我现在试图解决一段时间的问题而且我不知道我做错了什么。

3 个答案:

答案 0 :(得分: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)进行数学运算。

答案 1 :(得分:0)

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

ydiff = y2 - y1
xdiff = x2 - x1

然后找到atan2ydiff的{​​{1}}:

xdiff

的Bam!你刚刚获得了点1和点2之间的角度。它可能是弧度,所以先转换。

答案 2 :(得分:0)

你必须找到地平线之间的角度(默认值:向东)和桶底座与鼠标位置之间的线。所以,首先你得到相对于一些不动和地平线对齐实体的桶位置(提示:阶段),然后你也得到相对于阶段的鼠标位置,然后减去Y和X,调用Math.atan2()并从弧度转换为度。应该做。代码来自Barrel:

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;