Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отсчёт времени в Timer (http://www.flasher.ru/forum/showthread.php?t=183354)

Dip52 19.08.2012 20:29

Отсчёт времени в Timer
 
Здравствуйте, дорогие друзья. Представьте ситуацию: вы создали таймер, установили время, через которое событие будет запущено и написали старт. Время пошло.
Как узнать время, которое идёт? Допустим: Через N секунд будет запущено событие.

Wadimir 19.08.2012 21:57

можно создать переменную(счётчик) которая будет увеличиваться на единицу каждый раз как приходит событие от таймера и когда счётчик будет равен заданному значению запустить другое событие

Dip52 19.08.2012 22:18

Цитата:

Сообщение от Wadimir (Сообщение 1092867)
можно создать переменную(счётчик) которая будет увеличиваться на единицу каждый раз как приходит событие от таймера и когда счётчик будет равен заданному значению запустить другое событие

Правильно ли я понимаю, что вы имели в виду написать именно так, как я написал ниже?
Код AS1/AS2:

package SRCa
{
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
        public class ForTImer extends MovieClip
        {
                public var InstallSomeTime:int = 10;
                public var ObjectTimer:Timer = new Timer(1000,InstallSomeTime);
                public var NumberIsTimer:Number = 0;
                public function ForTImer()
                {
                        ObjectTimer.addEventListener(TimerEvent.TIMER, EventTimer);
                        ObjectTimer.start();
                }
                public function EventTimer(Event:TimerEvent):void
                {
                        trace("Количество повторов:",Event.target.currentCount);
 
                        if(Event.target.currentCount == InstallSomeTime)
                        {
                                trace("Миг настигнут!");
                        }
                }
        }
}


ChuwY 19.08.2012 22:22

Код AS3:

var lastMsec : Number = (timer.totalCounts - timer.currentCount)*timer.delay;

Как-то так.

Wolsh 19.08.2012 23:12

если количество тиков установлено, в конце таймер выдаст TimerEvent.TIMER_COMPLETE

Dip52 21.08.2012 18:32

Цитата:

Сообщение от ChuwY (Сообщение 1092872)
Код AS3:

var lastMsec : Number = (timer.totalCounts - timer.currentCount)*timer.delay;

Как-то так.

А можете продемонстрировать пример? У меня не получается в мозгу это спаять с таймером.

Wolsh 21.08.2012 20:24

Кого тут спаивать? timer это Ваш Event.target, все остальное это его свойства.
У Вас правда компилится код, в котором переменная названа как импортированный Класс?
Может, стоит писать по конвенции? Классы с большой, члены классов — с маленькой?

ChuwY 21.08.2012 20:28

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class TimTest extends Sprite
        {
                private static const DELAY : Number = 100;
                private static const REPEAT_COUNTS : uint = 100;
                private var _timer : Timer = new Timer(DELAY, REPEAT_COUNTS);
                public function TimTest()
                {
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
                        _timer.start();
                }
 
                //*** handlers ***//
                private function onTimer(event : TimerEvent):void
                {
                        var lastMsec : Number = (_timer.repeatCount - _timer.currentCount)*_timer.delay;
                        trace("До конца отсчета осталось " + lastMsec + " миллисекунд");
                }
 
                private function onTimerComplete(event : TimerEvent):void
                {
                        trace('Таймер завершил работу');
                }
        }
}


i.o. 22.08.2012 01:07

А я подумал, что речь про вот такое шла. Может и ошибаюсь :)
Мышкой нужно потыкать.
Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (stage)
                                stage.addEventListener(MouseEvent.CLICK, _onMClick);
 
                        _timer = new Timer(0, 1);
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, _onTimerComplete);
                }
 
 
                private var _timer : Timer;
                private var _timerStartTime : int = -1;
 
 
                private function _getTimerTime() : int
                {
                        if (_timer.running)
                                return (getTimer() - _timerStartTime);
                        return -1;
                }
 
                private function _restartTimer() : void
                {
                        if (_timer.running)
                                _timer.reset();
 
                        _timer.delay = 100 + 1000 * Math.random();
                        _timer.start();
                        _timerStartTime = getTimer();
 
                        this.addEventListener(Event.ENTER_FRAME, _printTimerProgressEveryFrame);
 
                        trace("=== TIMER STARTED ===");
                }
 
                private function _onMClick( e:MouseEvent ) : void
                {
                        if (_timer.running)
                                trace(_getTimerTime());
                        else
                                _restartTimer();
                }
 
                private function _printTimerProgressEveryFrame( e:Event ) : void
                {
                        var t:int = _getTimerTime();
                        var p:Number = 100.0 * Math.min(1.0, (t / _timer.delay));
                        p = Math.round(10 * p) / 10;
 
                        trace("Progress: " + p.toFixed(1) + " %    " + t + " of " +  int(_timer.delay) + " ms");
                }
 
                private function _onTimerComplete( e:TimerEvent ) : void
                {
                        trace("=== TIMER COMPLETE ===");
 
                        this.removeEventListener(Event.ENTER_FRAME, _printTimerProgressEveryFrame);
                }
        }
}

Код:

=== TIMER STARTED ===
Progress: 2.2 %    13 of 582 ms
Progress: 7.0 %    41 of 582 ms
Progress: 12.9 %    75 of 582 ms
Progress: 18.7 %    109 of 582 ms
Progress: 24.2 %    141 of 582 ms
Progress: 30.1 %    175 of 582 ms
Progress: 36.1 %    210 of 582 ms
Progress: 41.6 %    242 of 582 ms
Progress: 47.1 %    274 of 582 ms
Progress: 52.9 %    308 of 582 ms
Progress: 58.7 %    342 of 582 ms
Progress: 64.2 %    374 of 582 ms
Progress: 70.1 %    408 of 582 ms
Progress: 75.9 %    442 of 582 ms
Progress: 81.4 %    474 of 582 ms
Progress: 87.4 %    509 of 582 ms
Progress: 92.9 %    541 of 582 ms
Progress: 98.8 %    575 of 582 ms
Progress: 100.0 %    607 of 582 ms
=== TIMER COMPLETE ===
=== TIMER STARTED ===
Progress: 16.8 %    32 of 190 ms
Progress: 34.6 %    66 of 190 ms
Progress: 51.4 %    98 of 190 ms
Progress: 69.2 %    132 of 190 ms
Progress: 87.0 %    166 of 190 ms
Progress: 100.0 %    198 of 190 ms
=== TIMER COMPLETE ===


Dip52 22.08.2012 20:42

Цитата:

Сообщение от Wolsh (Сообщение 1093216)
Кого тут спаивать? timer это Ваш Event.target, все остальное это его свойства.
У Вас правда компилится код, в котором переменная названа как импортированный Класс?
Может, стоит писать по конвенции? Классы с большой, члены классов — с маленькой?

Спасибо за беспокойство, но я считаю себя не таким уверенным человеком (знающим хорошо ActionScript 3), как вы, поэтому и позволил себе спросить. Спасибо ещё раз. Так, случайно пропустил на счёт "У Вас правда компилится код, в котором переменная названа как импортированный Класс?". Можете уточнить? Код компилируется, правда. Вот результат:
Количество повторов: 1
Количество повторов: 2
Количество повторов: 3
Количество повторов: 4
Количество повторов: 5
Количество повторов: 6
Количество повторов: 7
Количество повторов: 8
Количество повторов: 9
Количество повторов: 10
Миг настигнут!


Добавлено через 56 секунд
Цитата:

Сообщение от i.o. (Сообщение 1093269)
А я подумал, что речь про вот такое шла. Может и ошибаюсь :)
Мышкой нужно потыкать.
Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (stage)
                                stage.addEventListener(MouseEvent.CLICK, _onMClick);
 
                        _timer = new Timer(0, 1);
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, _onTimerComplete);
                }
 
 
                private var _timer : Timer;
                private var _timerStartTime : int = -1;
 
 
                private function _getTimerTime() : int
                {
                        if (_timer.running)
                                return (getTimer() - _timerStartTime);
                        return -1;
                }
 
                private function _restartTimer() : void
                {
                        if (_timer.running)
                                _timer.reset();
 
                        _timer.delay = 100 + 1000 * Math.random();
                        _timer.start();
                        _timerStartTime = getTimer();
 
                        this.addEventListener(Event.ENTER_FRAME, _printTimerProgressEveryFrame);
 
                        trace("=== TIMER STARTED ===");
                }
 
                private function _onMClick( e:MouseEvent ) : void
                {
                        if (_timer.running)
                                trace(_getTimerTime());
                        else
                                _restartTimer();
                }
 
                private function _printTimerProgressEveryFrame( e:Event ) : void
                {
                        var t:int = _getTimerTime();
                        var p:Number = 100.0 * Math.min(1.0, (t / _timer.delay));
                        p = Math.round(10 * p) / 10;
 
                        trace("Progress: " + p.toFixed(1) + " %    " + t + " of " +  int(_timer.delay) + " ms");
                }
 
                private function _onTimerComplete( e:TimerEvent ) : void
                {
                        trace("=== TIMER COMPLETE ===");
 
                        this.removeEventListener(Event.ENTER_FRAME, _printTimerProgressEveryFrame);
                }
        }
}

Код:

=== TIMER STARTED ===
Progress: 2.2 %    13 of 582 ms
Progress: 7.0 %    41 of 582 ms
Progress: 12.9 %    75 of 582 ms
Progress: 18.7 %    109 of 582 ms
Progress: 24.2 %    141 of 582 ms
Progress: 30.1 %    175 of 582 ms
Progress: 36.1 %    210 of 582 ms
Progress: 41.6 %    242 of 582 ms
Progress: 47.1 %    274 of 582 ms
Progress: 52.9 %    308 of 582 ms
Progress: 58.7 %    342 of 582 ms
Progress: 64.2 %    374 of 582 ms
Progress: 70.1 %    408 of 582 ms
Progress: 75.9 %    442 of 582 ms
Progress: 81.4 %    474 of 582 ms
Progress: 87.4 %    509 of 582 ms
Progress: 92.9 %    541 of 582 ms
Progress: 98.8 %    575 of 582 ms
Progress: 100.0 %    607 of 582 ms
=== TIMER COMPLETE ===
=== TIMER STARTED ===
Progress: 16.8 %    32 of 190 ms
Progress: 34.6 %    66 of 190 ms
Progress: 51.4 %    98 of 190 ms
Progress: 69.2 %    132 of 190 ms
Progress: 87.0 %    166 of 190 ms
Progress: 100.0 %    198 of 190 ms
=== TIMER COMPLETE ===


Спасибо, сохранил, теперь попробую понять, что да как. Понравилось как вы сделали: "увеличение количества процентов".

Добавлено через 4 минуты
Цитата:

Сообщение от ChuwY (Сообщение 1093217)
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class TimTest extends Sprite
        {
                private static const DELAY : Number = 100;
                private static const REPEAT_COUNTS : uint = 100;
                private var _timer : Timer = new Timer(DELAY, REPEAT_COUNTS);
                public function TimTest()
                {
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
                        _timer.start();
                }
 
                //*** handlers ***//
                private function onTimer(event : TimerEvent):void
                {
                        var lastMsec : Number = (_timer.repeatCount - _timer.currentCount)*_timer.delay;
                        trace("До конца отсчета осталось " + lastMsec + " миллисекунд");
                }
 
                private function onTimerComplete(event : TimerEvent):void
                {
                        trace('Таймер завершил работу');
                }
        }
}


И вам спасибо. Только вопрос: почему именно 'Number = (_timer.repeatCount - _timer.currentCount)*_timer.delay;', находится в переменной lastMsec? Я попробовал реализовать без этой переменной, результат тот же. Может наличие переменной — это пример правильной работы, по конвенции? Если вам будет не сложно, то подкиньте какое-нибудь имя автора, например Мука, где об этом написано. Удачи.


Часовой пояс GMT +4, время: 07:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.