11.3.减速运动

问题
我想让物体平滑的移动到指定位置,就是要慢慢降速,直到停止在指定的位置
解决办法
使用抛物线公式
讨论
首先我们看看减速的概念,察看一个物体从当前位置移动到另一个位置,根据两点之间的距离物体每次移动总距离的1/2,1/3或更少,重复此过程知道物体到达目标位置。

你会发现第一次移动距离很大,接着越来越慢直到停止移动,用速率的观点来说,速率开始时很高,慢慢地减少直到零,另外该速率依赖于距离,距离越大速率越高。

下面的例子掩饰了简单的减速运动。目标位置保存在_targetX和_targetY变量。每次移动比例保存在_easingSpeed变量中,这里设置为0.1,表示总距离的1/10。
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class Easing extends Sprite {
private var _sprite:Sprite;
private var _easingSpeed:Number = 0.1;
private var _targetX:Number = 400;
private var _targetY:Number = 200;
private var _timer:Timer;
public function Easing( ) {
_sprite = new Sprite( );
_sprite.graphics.beginFill(0x0000ff, 100);
_sprite.graphics.drawCircle(0, 0, 25);
_sprite.graphics.endFill( );
_sprite.x = 50;
_sprite.y = 50;
addChild(_sprite);
_timer = new Timer(30);
_timer.addEventListener("timer", onTimer);
_timer.start( );
}
public function onTimer(event:TimerEvent):void {
var vx:Number = (_targetX - _sprite.x) * _easingSpeed;
var vy:Number = (_targetY - _sprite.y) * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
}
}
}

这里有个小问题,当物体到底目标位置时,定时器却仍然在运行,我们修改下代码,检测距离小于1时停止定时器:
+展开
-ActionScript
public function onTimer(event:TimerEvent):void {
var dx:Number = _targetX - _sprite.x;
var dy:Number = _targetY - _sprite.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if(dist < 1)
{
_sprite.x = _targetX;
_sprite.y = _targetY;
_timer.stop( );
}
else
{
var vx:Number = dx * _easingSpeed;
var vy:Number = dy * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
}
}


上面的例子代码首先计算出两点之间的距离,如果距离小于1,则把物体移到目标位置上,然后停止定时器。

有时候你可能不希望减速到停止位置,比如物体跟随鼠标移动,这里我们只需要把_targetX和_targetY替换为mouseX和mouseY即可::
+展开
-ActionScript
public function onTimer(event:TimerEvent):void {
var vx:Number = (mouseX - _sprite.x) * _easingSpeed;
var vy:Number = (mouseY - _sprite.y) * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(76)喜欢(0)flash/flex/fcs/AIR