2013-05-31 37 views
0

我想根据光标的位置制作一个可以提升或降低大炮桶的游戏。根据光标位置使对象旋转

这里是我插在桶里面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; 
} 
} 

出于某种原因,枪管只是抽搐甚至在鼠标是..方向围而不= /我喜欢一些建议或可能是不同的编码建议 这是一个我现在正在试图解决的问题,我不知道我做错了什么。

回答

0

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

ydiff = y2 - y1 
xdiff = x2 - x1 

然后找到ydiffxdiffatan2

Math.atan2(ydiff,xdiff)

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

0

您必须找到地平线(默认值:向东)和桶基与鼠标位置之间的角度。所以,首先你得到桶位置相对于一些不动和水平对齐的实体(提示:舞台),然后你得到相对于舞台的鼠标位置,然后减去Ys和Xs,调用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; 
1

就像其他人说的那样,最好的方法是使用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)。