AS3需要暂停的时间

时间:2011-06-09 13:56:02

标签: actionscript timer

我正在开发一款手机游戏,并且当游戏失去焦点时需要暂停游戏时间,例如当电话进入时。我有一切正常工作,除非当游戏再次获得焦点时,时间调整为好像它一直在运行。如果有人在回来时有3分钟的通话时间,他们应该找到游戏时间。

这是我的代码:

    public function showTime(event:Event){
            gameTime = getTimer()-gameStartTime;
            timeDisplay.text = "Time: "+clockTime(gameTime);
        }

    public function clockTime(ms:int) {
        var seconds:int = Math.floor(ms/1000);
        var minutes:int = Math.floor(seconds/60);
        seconds -= minutes*60;

        var timeString:String = minutes+":"+String(seconds+100).substr(1,2);
        return timeString;
    }


    public function onActivate(event:Event):void {
        addEventListener(Event.ENTER_FRAME, showTime);
    }


    public function onDeactivate(event:Event):void {
        removeEventListener(Event.ENTER_FRAME, showTime);
    }

我已经谷歌搜索了两天而且卡住了。有人可以指点我正确的方向吗?一些示例代码也是一个好处,因为我对AS3很新。谢谢!

3 个答案:

答案 0 :(得分:1)

你可以查看我之前写过的这个秒表教程:

http://www.popamihai.com/2010/10/flex/using-the-timer-class-in-flex-to-display-a-simple-stopwatch/

它是使用Flex Builder 3编写的,但您可以轻松复制/粘贴代码。启用了视图源的示例也包括在内

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle"
backgroundColor="white" viewSourceURL="srcview/index.html" creationComplete="init()">

<mx:Script>
    <![CDATA[
        import flash.utils.getTimer;
        import flash.utils.Timer;
        import flash.events.TimerEvent;

        private const TIMER_INTERVAL:int = 50;
        private var timerAtStart:Number = 0;
        private var timerAtPause:Number = 0;
        private var t:Timer;
        private var d:Date;

        [Bindable] private var sec:int = 0;
        [Bindable] private var min:int = 0;
        [Bindable] private var mls:int = 0;

        private function init():void {
            t = new Timer(TIMER_INTERVAL);
            t.addEventListener( TimerEvent.TIMER, updateTimer );
        }

        private function updateTimer( evt:TimerEvent ):void{
            d = new Date( getTimer() - timerAtStart + timerAtPause);
            min = d.minutes;
            sec = d.seconds;
            mls = d.milliseconds;
        }

        private function startPauseTimer( event:MouseEvent ):void{
            if ( event.target.label == "start" ) {
                event.target.label = "pause";
                timerAtStart = getTimer();
                t.start();
            } else {
                event.target.label = "start";
                timerAtPause = min * 60000 + sec * 1000 + mls;
                t.stop();
            }

        }

    ]]>
</mx:Script>

<mx:Label text="{min + ' : ' + sec + ' : ' + mls}" fontSize="16" fontWeight="bold"/>
<mx:HBox>
    <mx:Button label="start" click="startPauseTimer( event )"/>
</mx:HBox>
</mx:Application>

答案 1 :(得分:0)

您应该创建一个计时器对象并添加一个事件监听器以“tick”来更新时钟,而不是使用getTimer()。您甚至可以将其设置为每秒刻度一次,这样您就不必转换MS。

public function onActivate(event:Event):void {
    myTimer.start();
}


public function onDeactivate(event:Event):void {
    myTimer.stop();
}

请参阅计时器参考:http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/utils/Timer.html

答案 2 :(得分:0)

您根据当前时间计算时间 - gameStartTime。您需要考虑延迟(在getTimer()onActivate()函数中使用onDeactivate()计算停止的总时间,然后将该差异添加到gameStartTime),或者如果您不想更改gameStartTime,则可以根据增量时间计算时间。类似的东西:

private var m_prevTime:int = 0;

public function startGame():void
{
    // set the prevTime only when you start the game, otherwise you'll 
    // take into account all the time for flash to get going, your init,
    // opening screens etc
    this.m_prevTime = getTimer();
}

public function showTime(event:Event)
{
    // get the difference in time
    var currTime:int = getTimer();
    gameTime += currTime - this.m_prevTime // currTime - prevTime = delta time
    this.m_prevTime = currTime; // hold the current time

    // display it
    timeDisplay.text = "Time: "+clockTime(gameTime);
}


public function onActivate(event:Event):void 
{
    // we're reactivating, so make sure prev time is updated
    this.m_prevTime = getTimer();
    addEventListener(Event.ENTER_FRAME, showTime);
}

从更新回来时你会错过一个帧的时间,但它并不显着(或者你可以在onActivate()函数中减去帧的时间)