ActionScript 3.0:在移动之间延迟移动对象

时间:2011-05-18 23:11:15

标签: flash actionscript-3 actionscript adobe

我正在开发一款游戏,我想让一个影片剪辑从一个随机位置移动到另一个位置,每次移动之间都有一个暂停。我已经在一些教程的帮助下编写了一些代码,但我无法按照我想要的方式工作。我是ActionScript的新手,所以我可能做错了。现在我的所有游戏都会暂停一段时间,然后对象会非常快速地从一个位置跳到另一个位置而不会停止。

//movement of searchlight

var i:int;
for (i = 0; i < 5; i++)
{
var startTime = getTimer();

stage.addEventListener(Event.ENTER_FRAME, timeDelay);

function timeDelay(event:Event):void
{
    var timePassed = getTimer();
    if (timePassed - startTime >= 5000)
    {
        moveTo();
    }
}

myObject.x = Math.round(Math.random() * 550);
myObject.y = Math.round(Math.random() * 400);
myObject.rotation = Math.round(Math.random() * 360);

// a counter that counts the current
// frame of the animation
var currentFrameCount:int;
// the total frames in the animation
var totalFrameCount:int = 20;

// the location when the animation starts
var initialX:Number;
var initialY:Number;
// the distance between the initial
// location and the destination
var distanceX:Number;
var distanceY:Number;

// when animation starts
function moveTo():void
{

    var myLocationX = Math.round(Math.random() * 550);
    var myLocationY = Math.round(Math.random() * 400);

    // the destination location 
    var destinationX:Number = myLocationX;
    var destinationY:Number = myLocationY;

    // reset frame count to 0
    currentFrameCount = 0;
    // set initial locations to the
    // current location of myObject
    initialX = myObject.x;
    initialY = myObject.y;
    // find the distance values by finding
    // the difference between initial and destination
    distanceX = destinationX - initialX;
    distanceY = destinationY - initialY;
            // set up rotation
    var initialAngle = myObject.rotation;
    var myAngleStart = Math.atan2(myLocationY-initialY,myLocationX-initialX)/(Math.PI/180);
    var myAngle = myAngleStart + 284;
    myObject.rotation = myAngle;

    // set up the enterFrame loop to 
    // animate the animation
    myObject.addEventListener(Event.ENTER_FRAME, animateMoveTo);

    // handling the animation over time;
    function animateMoveTo(evt:Event):void
    {
        // each frame, increment the frame count
        // to move the animation forward
        currentFrameCount++;
        // if the frame count has not yet reached the
        // final frame of the animation, myObject
        // needs to be moved to the next location
        if (currentFrameCount < totalFrameCount)
        {
            // find the progress by comparing current frame
            // with the total frames of the animation
            var progress:Number = currentFrameCount / totalFrameCount;
            // set myObject's position to include the new
            // distance from the original location as
            // defined by the distance to the destination
            // times the progress of the animation
            myObject.x = initialX + distanceX * progress;
            myObject.y = initialY + distanceY * progress;
            myObject.rotation = initialAngle + myAngle * progress;
        }
        else
        {
            // when the animation is complete, set the
            // position of myObject to the destination
            myObject.x = destinationX;
            myObject.y = destinationY;

            // remove the enterFrame event handler so the 
            // animation ceases to run
            myObject.removeEventListener(Event.ENTER_FRAME, animateMoveTo);
        }
    }
}
}

更新:这是我最终做的事情:

import com.greensock.TweenLite;

//set random starting location and rotation
myObject.x = Math.round(Math.random() * 550);
myObject.y = Math.round(Math.random() * 400);
myObject.rotation = Math.round(Math.random() * 360);

//create variables
var initialX:Number;
var initialY:Number;
var destinationX:Number;
var destinationY:Number;
var myAngleStart;
var myAngle;

//timer
var timer:Timer = new Timer( 12000 )
timer.addEventListener( TimerEvent.TIMER,rotate );
timer.start();

//function rotate
function rotate( e:TimerEvent ):void{
//set variables for current location
initialX = myObject.x
initialY = myObject.y
//set new destination
destinationX = Math.round(Math.random() * 550);
destinationY = Math.round(Math.random() * 400);
//set rotation
myAngleStart = Math.atan2(destinationY-initialY,destinationX-initialX)/(Math.PI/180);
myAngle = myAngleStart + 284;
//rotate towards new destination
TweenLite.to(myObject, 5, {rotation:myAngle, onComplete:moveTo});
}

//function moveTo
function moveTo():void {
TweenLite.to(myObject, 7, {x:destinationX, y:destinationY});
}

3 个答案:

答案 0 :(得分:2)

您应该查看许多方便的补间引擎之一,例如TweenLiteTweener。他们使这种事情变得非常容易。

答案 1 :(得分:1)

好的,我对此做了一些工作,我觉得这很接近你想要的。旋转不能正常工作,但我现在没有时间搞乱它。此方法高度依赖于帧速率。如果您使用此方法补间,如果用户帧速率低于您设置影片的帧速率,则会出现问题。我将帧速率设置为30fps。我认为这可以让您在改进代码方面走上正轨:

    //Declare Globals
var currentFrameCount:int=0;
var totalFrameCount:int = 30;
myObject.x = Math.round(Math.random() * 550);
myObject.y = Math.round(Math.random() * 400);
var destinationX:Number = myObject.x;
var destinationY:Number = myObject.y;
var initialX:Number;
var initialY:Number;
var distanceX:Number;
var distanceY:Number;
var xProg:Number;
var yProg:Number;
var myAngleChange;
var myAngleEnd;
var initialAngle;

var countFrame:int = 0;
var delay:int = 0;

addEventListener(Event.ENTER_FRAME,callDelay);
function callDelay(e:Event){
        countFrame++;
        delayEvent(delay);
}
//Code to move the object to a random location and give it a random target to move to.
function spawnObject(){
        myObject.rotation = Math.round(Math.random() * 360);//random rotation
        initialAngle = myObject.rotation;
        destinationX = Math.round(Math.random() * 550);//random destination
        destinationY = Math.round(Math.random() * 400);
        currentFrameCount = 0;
        initialX = myObject.x;
        initialY = myObject.y;
        distanceX = destinationX - initialX;//distance between destination and initial
        distanceY = destinationY - initialY;
        initialAngle = myObject.rotation;//buggy rotation code
        myAngleEnd = Math.atan2(destinationY-initialY,destinationX-initialX)/(Math.PI/180);
        myAngleChange = (initialAngle - myAngleEnd)/totalFrameCount;
        xProg = distanceX/totalFrameCount;//amount to increase by each frame
        yProg = distanceY/totalFrameCount;
}


function delayEvent(period){
        if ( (countFrame) >= period){
                removeEventListener(Event.ENTER_FRAME,callDelay);
                timedEvent();
                countFrame=0;
                return;
        }

}


function timedEvent ():void
{
                currentFrameCount = totalFrameCount;
                myObject.x = destinationX;
                myObject.y = destinationY;
                spawnObject();//move the object to a new location and give new destination
                myObject.addEventListener(Event.ENTER_FRAME,moveTo);//add an event listener to move the object around
}

function moveTo(e:Event):void
{
                myObject.rotation += myAngleChange; //increase rotation by the rotation step value (buggy)
        currentFrameCount++;
        if (currentFrameCount < totalFrameCount)
        { 
            myObject.x += xProg;//incrase x by the x step value
            myObject.y += yProg;//increase y by the y step value
        }
        else
        {
            myObject.removeEventListener(Event.ENTER_FRAME, moveTo);// remvoe this event listener
                        addEventListener(Event.ENTER_FRAME,callDelay);
        }
}

答案 2 :(得分:1)

如果您只想按设定的间隔移动对象,请使用此

var timer:Timer = new Timer( 1000 )
timer.addEventListener( TimerEvent.TIMER,moveTo );
timer.start();

function moveTo( e:TimerEvent ):void{
    myObject.x = Math.round(Math.random() * 550);
    myObject.y = Math.round(Math.random() * 400);
}