所以我想在没有任何补间库的情况下将对象补间到targetX和targetY,并且没有缓动。
我一直都在使用greensock用于我的所有补间,对于这种情况,greensock的DynamicPropsPlugin将是完美的,但它仅适用于俱乐部成员......
这次我需要将一个对象补间到一个动态变化的目标。
我知道如何使用缓动来补间对象,但是这次我需要在没有它的情况下补间对象,所以在到达第一个目标后它会顺利地继续到下一个目标。
这是可行的代码,但问题在于缓解:
package
{
import flash.display.*;
import flash.events.*;
/**
* ...
* @author me
*/
[SWF(width="1200", height="600", frameRate="30", backgroundColor="#ffffff")]
public class Test extends Sprite
{
// first target coordinates
private var targetX:Number=600;
private var targetY:Number = 450;
// second target coordinates
private var targetX2:Number=900;
private var targetY2:Number = 300;
// check if first target is reached
private var _pointReached:Boolean
// object to tween
private var _ball:Sprite;
public function Test()
{
init()
}
private function init():void
{
// simple ball
_ball = new Sprite();
_ball.graphics.beginFill(0xff0000);
_ball.graphics.drawCircle( -50, -50, 50);
_ball.graphics.endFill();
addChild(_ball);
addEventListener(Event.ENTER_FRAME, onLoop);
}
private function onLoop(e:Event):void
{
var vx:Number;
var vy:Number;
if (_pointReached) { // next target
// easing
vx = (targetX2 - _ball.x) * .3;
vy = (targetY2 - _ball.y) * .3;
}else {
// easing
vx = (targetX - _ball.x) * .3;
vy = (targetY - _ball.y) * .3;
}
// check distance
var dx:Number = targetX - _ball.x;
var dy:Number = targetY - _ball.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if (dist <= 0.6) {
// first target point reached
_pointReached = true;
}
// tween an object
_ball.x += vx;
_ball.y += vy;
}
}
}
有什么想法吗?
谢谢!
答案 0 :(得分:0)
使用计时器类和内部计时器功能将对象移向目标。直到物体到达目标位置为止。
答案 1 :(得分:0)
试试这个(UNTESTED):
private function onLoop(e:Event):void
{
var xDistance:Number;
var yDistance:Number;
if (_pointReached) { // next target
xDistance = _ball.x - targetX2;
yDistance = _ball.y - targetY2;
}else {
xDistance = _ball.x - targetX;
yDistance = _ball.y - targetY;
}
var rotation:Number = Math.atan2(yDistance, xDistance);
var speed:int = 2;
// tween an object
_ball.x -= speed * Math.cos(rotation);
_ball.y -= speed * Math.cos(rotation);
if (dist <= 0.6) {
// first target point reached
_pointReached = true;
}
}
答案 2 :(得分:0)
在您的原始代码中,在与此类似的行上:
vx =(targetX - _ball.x)* .3;
删除* .3部分。那是你的摩擦或缓和。然后您的代码应该无需缓和。