我正在尝试将一些位图设置为与中心点相关的动画。它们并非都是从那个中心点开始,但是我希望它们飞出来,好像来自该中心点的力猛击它们并将它们径向向外推,这样它们就会完全飞离舞台。
所以:我知道中心点,以及围绕它排列的每个位图的x和y位置。对于每一个,我可以从中心到x,y点画一条线。然后我应该能够将该线形成的角度设置为水平,然后在该线上设置更远的目标点。位图将被补发到那一点。我相信这就是Math.atan2的用途。
这是我在迭代位图数组时得到的东西(我是一个对象):
var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX) * 180 / Math.PI;
var dist:Number = 200; //arbitrary number, just to test
destX = centerX + dist * Math.cos(angle); //destination x
destY = centerY + dist * Math.sin(angle); //destination y
这些东西不是径向滑出,而是跳来跳去。
我无法理解atan2以及我做错了什么。
谢谢,
大卫
答案 0 :(得分:1)
只使用矢量运算,您可以在没有三角函数的情况下实现相同的效果:
var dist:Number = 200; //arbitrary number, just to test
var dx:Number = i.bitmap.x - centerX;
var dy:Number = i.bitmap.y - centerY;
var length:Number = Math.sqrt( dx*dx + dy*dy );
var normalizeddx:Number = dx / length;
var normalizeddy:Number = dy / length;
destX = centerX + dist * normalizeddx; //destination x
destY = centerY + dist * normalizeddy; //destination y
这应该比使用三角函数快得多。我不知道actionscript的语言细节,所以可能会更多地优化它。
答案 1 :(得分:0)
atan2可以在这种情况下工作,我想但我只会使用atan:
var angle:Number = Math.atan((i.bitmap.y - centerY)/(i.bitmap.x - centerX));
此外:
我刚刚在另一个看起来像你想要的论坛上看到的代码(与你最初写的东西只有一点点差异)
var angle:Number = Math.atan2(mouseX,mouseY-180)-Math.PI/2;
var xNew:Number = 20*Math.cos(angle);
var yNew:Number = -20*Math.sin(angle);
答案 2 :(得分:0)
尝试移除* 180 / PI以保持角度为弧度。
var angle:Number = Math.atan2(i.bitmap.y-centerY, i.bitmap.x - centerX);
然后将destX和destY更改为
destX = i.bitmap.x + dist * Math.cos(angle);
destY = i.bitmap.y + dist * Math.sin(angle);
答案 3 :(得分:0)
你必须摆脱* 180 / Math.PI部分。角度必须是弧度。所以第一行看起来像是
var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX);
其余的应该没问题。