Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как создать таймер не зависящий от времени компьютера (http://www.flasher.ru/forum/showthread.php?t=184628)

Keyles 23.09.2012 15:40

Как создать таймер не зависящий от времени компьютера
 
Добрый день.

Есть файл с кодом, управляющим часами на сцене.
Код AS3:

package ru.nsab.player {
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
        public class Clock extends MovieClip {
 
                private var _timer:Timer = new Timer(1000);
                private var _start:Date = new Date();
                private var offset:Number = _start.getTimezoneOffset()*60000;
                private var datePassed:Date = new Date();
 
                private function onTimer(event:TimerEvent):void {
                        updateClock();
                }
 
                private function f(n:Number):String {
                        return n<10 ? "0"+n : n.toString();                               
                }
 
                private function formatDate(d:Date):String {                       
                        return f(d.getHours()) + ":" + f(d.getMinutes()) + ":" + f(d.getSeconds());                       
                }
 
                private function updateClock():void {
                        var dateNow:Date = new Date();
                        var timePassed:Number = dateNow.getTime() - _start.getTime() + offset;
                        datePassed.setTime(timePassed);
 
                        this["timeRunning"].text = formatDate(datePassed);
                        this["timeNow"].text = formatDate(dateNow);
                }
 
                public function Clock() {
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.start();
                        updateClock();}               
}       
}

Сейчас я убрала со сцены таймер с именем timeNow, и нужно отвязать таймер timeRunning от времени компьютера, чтобы он просто считал время с 00:00.

Как это правильно сделать в данном коде??

Azo 23.09.2012 16:00

Можно просто вычитать время старта таймера.

00:00=Московское время например 21:00 - время когда запустили таймер (21:00)
00:01
00:02
...

artcraft 23.09.2012 16:08

используйте getTimer
при старте запомните время старта таймера
Код AS3:

 startTime:int = getTimer();

и потом при каждом апдейте вычислайте разницу между сейчас и старом таймера
Код AS3:

time = getTimer()-startTime;


Keyles 24.09.2012 08:31

Что нужно приравнивать к timeRunning, если я использую getTimer();??
Код AS3:

this["timeRunning"].text = formatDate(datePassed);


Wolsh 24.09.2012 11:09

Код AS3:

datePassed = new Date();
datePassed.setTime(getTimer() - startTime);
this["timeRunning"].text = formatDate(datePassed);


Keyles 27.09.2012 00:03

Код AS3:

package ru.nsab.player {
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
        public class Clock extends MovieClip {
 
                private var _timer:Timer = new Timer(1000);
                private var _start:Date = new Date();
                private var offset:Number = _start.getTimezoneOffset()*60000;
                private var datePassed:Date = new Date();
                private var startTime:Date = new Date();
 
                private function onTimer(event:TimerEvent):void {
                        updateClock();
                }
 
                private function f(n:Number):String {
                        return n<10 ? "0"+n : n.toString();                               
                }
 
                private function formatDate(d:Date):String {                       
                        return f(d.getHours()) + ":" + f(d.getMinutes()) + ":" + f(d.getSeconds());                       
                }
 
                private function updateClock():void {
 
                        var datePassed = new Date();
                        datePassed.setTime(getTimer() - startTime);
                        this["timeRunning"].text = formatDate(datePassed);
                }
 
                public function Clock() {
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.start();
                        updateClock();
                }}}

Так получается? Или нет?

Wolsh 27.09.2012 00:37

Не много ли datePassed?))
А что такое _start и startTime, обе — даты, инициализируемые одновременно, но не в конструкторе а "когда-то заранее"?
И почему одни приватные переменные именованы с подчеркиванием, как положено, а некоторые — нет?
Почему вообще у класса таймера название "часы", и нет методов для запуска и остановки?
Почему таймер extends MovieClip? Он содержит анимацию на таймлайне?
Что делает offset?
Сплошные вопросы...

Keyles 27.09.2012 00:49

offset:Number = _start.getTimezoneOffset()*60000;
Разница в минутах между местным временем компьютера и временем по всемирному скоординированному времени (UTC).

startTime - предложенная вами переменная, из кода выше)
таймер - не содержит анимации на сцене.

На сцене мувик Clock, в нем текстовые поля динамические timeRunning и timeNow.

Мне достался уже в таком виде файл, я могу лишь менять его, к сожалению.

Сплошные вопросы... - У меня тоже((

Wolsh 27.09.2012 00:52

Я имею в виду, что класс непонятен. И вопрос непонятен: "таймер не зависящий от времени компьютера". Таймер в принципе не может зависеть от времени компьютера.
Время показывают часы. Таймер отсчитывает прошедшее время от независимой (переменной) точки во времени.
Если это — таймер, то от какого момента он отсчитывает время, что такое 00:00:00?
Момент создания экземпляра? А если он будет помещен на сцену спустя 15 минут? Не проще ли было сделать в нем метод для запуска во избежание всяких разночтений?

Keyles 27.09.2012 08:53

Там основная строка управления
var timePassed:Number = dateNow.getTime() - _start.getTime() + offset

Зачем они прицепили offset, мне не ясно. Но из-за него на многих компьютерах сбивается таймер, и отсчитывает не 00-00, а допустим с 23-00.

В таком состоянии таймер показывает с 04-00.
Код AS3:

package ru.nsab.player {
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
        public class Clock extends MovieClip {
 
                private var _timer:Timer = new Timer(1000);
                private var _start:Date = new Date();
                private var datePassed:Date = new Date();
 
                private function onTimer(event:TimerEvent):void {
                        updateClock();
                }
 
                private function f(n:Number):String {
                        return n<10 ? "0"+n : n.toString();                               
                }
 
                private function formatDate(d:Date):String {                       
                        return f(d.getHours()) + ":" + f(d.getMinutes()) + ":" + f(d.getSeconds());                       
                }
 
                private function updateClock():void {
                        var dateNow:Date = new Date();
                        var timePassed:Number = dateNow.getTime() - _start.getTime();
                        datePassed.setTime(timePassed);
 
                        this["timeRunning"].text = formatDate(datePassed);
                }
 
                public function Clock() {
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.start();
                        updateClock();
                }               
 
        }
 
}

Какой вписать метод для запуска и куда его вставить?

Wolsh 27.09.2012 09:43

Ошибка в том, что Вы берете местное время в форматтере, а надо брать универсальное.
Код AS3:

private function formatDate(d:Date):String {                        
        return f(d.getUTCHours()) + ":" + f(d.getUTCMinutes()) + ":" + f(d.getUTCSeconds());                       
}

Как-то так. У меня с нуля показывает, Ваш последний код показывал с новосибирским оффсетом — с 06:00:00.
Код AS3:

package ru.nsab.player {
        import flash.display.MovieClip;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
 
        public class Clock extends MovieClip {
 
                private var _timer:Timer = new Timer(1000);
                private var _start:Date;
                private var _datePassed:Date = new Date();
 
                public function Clock() {}               
 
                public function start():void {
                        _start = new Date();
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.start();
                        updateClock();
                }
 
                private function onTimer(event:TimerEvent):void {
                        updateClock();
                }
 
                private function f(n:Number):String {
                        return n<10 ? "0"+n : n.toString();                               
                }
 
                private function formatDate(d:Date):String {                       
                        return f(d.getUTCHours()) + ":" + f(d.getUTCMinutes()) + ":" + f(d.getUTCSeconds());                       
                }
 
                private function updateClock():void {
                        var dateNow:Date = new Date();
                        var timePassed:Number = dateNow.getTime() - _start.getTime();
                        _datePassed.setTime(timePassed);
                        this["timeRunning"].text = formatDate(_datePassed);
                }
        }
}

А, ну и запуск:
Код AS3:

var clock:Clock = new Clock();
this.addChild(clock);
clock.x = clock.y = 100;
clock.start();

И да, учтите что в полночь карета превращается в тыкву.
Потому что это не таймер, а часы, на которых установили 00:00:00 и запустили. Показывать они все-равно будут время, а не количество часов, минут и секунд. То есть когда количество часов станет больше 23, поле "часы" начнет показывать с нуля, а не 24..25..26.

Keyles 21.10.2012 16:04

Ошибка в том, что Вы берете местное время в форматтере, а надо брать универсальное.
Поменяла, все отлично стало)

начнет показывать с нуля, а не 24..25..26.
это да. не думаю что его будут запускать на 23 часа. спасибо


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

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