Flash AS3:如何逐渐限制受鼠标y位置影响的对象的旋转

时间:2009-11-23 17:57:21

标签: flash actionscript-3 mouse pointers rotation

我创建了一个Flash应用程序,其中有一个圆圈,沿着圆周绘制圆圈,当鼠标向上或向下移动时,它会旋转。直接从鼠标指针的y位置绘制旋转。我想做的是对运动进行评分,以便鼠标指针越向下移动对旋转的影响越小。

我目前的代码是这样的:

myCircle.rotationZ = e.localY;

我可以使用哪种形式的数学公式,这会减少旋转量,鼠标位置的y位置越大?

谢谢,

eb_dev

4 个答案:

答案 0 :(得分:1)

嗯,这取决于你想要多快地衰减旋转角度。您可以简单地使用线性衰减。

rot = ((Rmax - Rmin) / (Ymax - Ymin)) * y + ((Rmin * Ymax) - (Rmax * Ymin)) / (Ymax - Ymin)
上面的表达式将根据从Ymax到Ymin的'y'值将旋转角度'rot'从Rmax线性地改变为Rmin。使用指数衰减可以做同样的事情。
数学背后:
rot = a * y + b //(where a,b are constants)
first boundary condition
Rmax = a * Ymax + b
second boundary condition
Rmin = a * Ymin + b
Solve above 2 equations to find out a and b.
a = (Rmax - Rmin) / (Ymax - Ymin)
b = ((Rmin * Ymax) - (Rmax * Ymin)) / (Ymax - Ymin) 

答案 1 :(得分:0)

有很多方法可以做你想要的。基本上听起来你正试图采用线性Y坐标并将其变成曲线。

像这样的东西可能会做你想要的(我在AS3有点生疏所以它需要一些调整,但它应该给你的想法 - YMMV):

var distance:Number = (Stage.Height - e.localY) / Stage.Height;
distance = distance * distance;
myCircle.rotationZ = distance * 2 * 3.1415927;

它将距离转换为0到1之间的数字,其中0位于底部,1位于顶部。

然后将距离从线性曲线调整为抛物线曲线。

最后,我们将值从范围0 - 1转换为0到2PI(旋转角度)。

答案 2 :(得分:0)

bhups是对的。这是指数版本 请不要害怕名称,阅读评论并访问维基百科以获得直观表示:)

var scale:int = 360;

var val:Number;

//从指数图中我选择了区间[-5,0]

//咨询http://en.wikipedia.org/wiki/Exponential_function,右上角的图片

//视角

/ *如果值为0,Math.exp将返回1;当降至-5时,它将返回

值越来越接近0

* /

var intervalMaxValue:Number = 0;

/ *警告!如果将intervalMaxValue更改为不同于0的值,则必须修改公式 * /

var intervalLength:Number = 5;

stage.addEventListener(Event.ENTER_FRAME,handlerEnterFrame);

function handlerEnterFrame(e:Event):void {

/ *  intervalMaxValue-intervalLength - >我们从-5

开始

1-(stage.mouseY / stage.stageHeight))* intervalLength - >并在鼠标停止时逐渐添加5到0之间的数字

Math.exp - >对于此间隔以0

结束,将其转换为介于0和1之间的值

比例 - >将其乘以比例以获得完整的0-360间隔* /

val = Math.exp(intervalMaxValue-intervalLength +((1-(stage.mouseY / stage.stageHeight))* intervalLength))* scale;

myCircle.rotation = VAL;

}

答案 3 :(得分:0)

alt text
(来源:mathnstuff.com

上图在x轴上从-4到4,很容易找出x = -5的y值 - 它几乎为0 - 所以请在阅读以下内容时考虑这一点。

请看上面的图表,它是指数函数的图表。看看x值从-5到0的增长情况如何?这不是一个线性增长,而是一个更大,更大的增长,而它达到0.这正是你动画所需要的。

val=Math.exp(intervalMaxValue-intervalLength+((1-(stage.mouseY/stage.stageHeight)) * intervalLength))*scale;

intervalMaxValue-intervalLength实际上是0-5,即-5

所以我们从-5开始!

下一步

stage.mouseY / stage.stageHeight = 0当你的鼠标位于舞台顶部时(因为stage.MouseY将为0)和1当鼠标位于舞台的底部时(stage.mouseY则相等)到stage.stageHeight所以你将stage.stageHeight除以stage.stageHeight,它将是1)

为了你的效果,你希望它被反转,当你在顶部时为1,当你在底部时为0,这就是你必须使用的原因(1-(stage.mouseY / stage.stageHeight))

现在,当鼠标位于顶部时,上面的公式返回1,当它位于底部时返回0(就像你希望它表现的那样,当它在顶部时是一个很大的旋转,当它到达底部时是一个小的旋转)

现在让我们只选择Math.exp部分,看看它的行为方式

val=Math.exp(intervalMaxValue-intervalLength+((1-(stage.mouseY/stage.stageHeight)) * intervalLength);

当你的鼠标位于TOP时,上面的公式将是-5 +((1-(0))* 5(< - 5这里是intervalLength);这将返回0.看看现在,对于x轴上的0,你在y轴上得到1。

现在让我们看看当鼠标处于BOTTOM -5+(1-(1))* 5时会发生什么。这将返回-5。对于x轴上的-5,y轴上的距离非常接近0,如上图所示。

让我们看看当鼠标处于MIDDLE -5+(1-(0.5))* 5时会发生什么。这将返回-5 + 2.5,这将是-2.5。对于x轴上的-2.5,你在y轴上更接近0而不是1.这是指数函数的作用。

正如您所看到的,在此区间[-5,0]上,指数函数会生成一个从0到1的y值,并且当该值接近x值0时,此值的增长会更大。

考虑到它生成一个从0到1的值,当它转到-5时会下降很多,你现在将这个值乘以360,这样你就可以得到一个角度值。

在TOP处,角度值为1 * 360;

MIDDLE:-2.5的Math.exp返回一个接近0.1的值,将其乘以360得到36.如果你将它与舞台TOP的360相比较你观察到它在鼠标时急剧下降到了中间。

BOTTOM:Math.exp为-5会返回一个非常接近0的值。与360相乘0并且没有角度移动。因此,当鼠标位于舞台底部时,旋转值非常接近0。

希望这很清楚,它是在一个晚上出去后的早上6:53写的

干杯。