AS3 время, которое нужно сделать паузу - PullRequest
0 голосов
/ 09 июня 2011

Я работаю над мобильной игрой и мне нужно, чтобы игровые часы останавливались, когда игра теряет фокус, например, когда поступает звонок. У меня все работает, за исключением того, что когда игра снова получает фокус, время настраивается так, как если бы оно бегал все время. Если кто-то звонит 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. Спасибо!

Rich

Ответы [ 3 ]

1 голос
/ 07 ноября 2013

Вы можете проверить это руководство по секундомеру, которое я написал некоторое время назад:

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>
0 голосов
/ 09 июня 2011

Вы рассчитываете свое время на основе текущего времени - 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())

0 голосов
/ 09 июня 2011

Вместо того, чтобы использовать getTimer (), вы должны создать объект таймера и добавить прослушиватель событий в «tick» для обновления часов. Вы даже можете установить галочку один раз в секунду, чтобы вам не приходилось конвертировать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...