AS3速度每秒像素

时间:2011-11-09 11:12:17

标签: ios actionscript-3 optimization timer air

这个论坛上的一个人告诉我要用这个: Frame skipping on Flash 而不是像thing.x -= 4;

那样

所以我做到了:

package  {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent; 
    import flash.utils.getTimer;


    public class Seamine extends MovieClip {

        private var core:Object;

        private var lastFrame:int = 0;
        private var thisFrame:int;
        private var pixelsPerSecond:Number = 100;
        private var percentToMove:Number; 

        public function Seamine():void{

            addEventListener(Event.ADDED_TO_STAGE, onadd);
        }

        private function onadd(e:Event){
            stage.addChild(this);
            addEventListener(Event.ENTER_FRAME, loop);
        }

        private function loop(e:Event):void{

            // Get the miliseconds since the last frame
            thisFrame = getTimer();
            percentToMove = (thisFrame - lastFrame) / 1000;
            // Save the value for next frame.
            lastFrame = thisFrame;
            // Update your system based on time, not frames.
            this.x -= pixelsPerSecond * percentToMove;


            if(this.x < 0 - this.width/2)
            {
                stage.removeChild(this);
                removeEventListener(Event.ENTER_FRAME, loop);
                removeEventListener(Event.ADDED_TO_STAGE, onadd);
            }

            if(GlobalVariables.GameOver == 1)
            {
                this.alpha -= .03;
            }

            if(this.alpha == 0)
            {
                this.alpha = 0;
                stage.removeChild(this);
                removeEventListener(Event.ENTER_FRAME, loop);
                removeEventListener(Event.ADDED_TO_STAGE, onadd);
            }

        }

    }

}

但出于某种原因,我的“Seamine”确实采取了其他的x posistion?所以它不是从一开始就开始的。实施例。

1开始,它有正确的速度。 Next Seamine spawn,但这一次,它不是从“起始x值”开始,因为它从Seamine 1开始。

我像这样生产Seamines:

var tm_Seamine:Timer = new Timer (2000);

tm_Seamine.addEventListener(TimerEvent.TIMER, Spawn_Seamine);
tm_Seamine.start();

function Spawn_Seamine(e:Event){

    var SM:Seamine = new Seamine();  

    var RandomYValue_1_Box:Number = Math.ceil(Math.random()*500);

    addChild(SM); 
    SM.y = RandomYValue_1_Box;
    SM.x = 1000;    

    addEventListener(Event.ENTER_FRAME, Hit_SM)

    function Hit_SM (e:Event){

        if(SM.hitTestPoint(Player.x,Player.y, true))
        {
            GlobalVariables.GameOver = 1;
        }
    }

}

1 个答案:

答案 0 :(得分:0)

getTimer()获取自 SWF 开始运行以来的毫秒数,而非对象。因此,如果您使用这段时间来计算移动对象的距离,那么对于所有对象,它将是相同的。因此,无论对象何时被创建,所有对象都将移动到相同的位置。

一个简单的解决方法是使用getTimer()而不是0初始化lastFrame。