我正在开发一款游戏,我想让一个影片剪辑从一个随机位置移动到另一个位置,每次移动之间都有一个暂停。我已经在一些教程的帮助下编写了一些代码,但我无法按照我想要的方式工作。我是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});
}
答案 0 :(得分:2)
答案 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);
}