Просмотр полной версии : Таймер обратного отсчета на Shared Object
Кот Баюн
24.10.2014, 16:29
Всем доброго времени суток!
Возникла одна трудность.
Видел в Интернете исходники таймеров обратного отсчета, на которых можно засечь N часов-минут-секунд, вроде бы все понятно.
А как можно прикрутить такой таймер к SharedObject, чтобы после закрытия флешки отсчет продолжался?
Возможно для этого надо записать текущую дату-время и дату-время окончания таймера и сверять их при открытии флешки?
что-то вы тут недоформулирвали: если после закрытия отсчет продолжается, то и сравнивать нужно текущее системное время с временем Ч, зачем нужно время закрытия предыдущей флешки ?
Кот Баюн
24.10.2014, 23:06
наверное недоформулировал.
ну короче говоря, примерно так.
я хочу засечь, допустим, шесть часов с какого-то момента, и чтобы после закрытия флешки таймер продолжал работать,
то есть, если открыть флешку через четыре часа, то он показывал бы, что два осталось.
Получается, записать в Shared Object начало и конец отсчета и отследить, идет отсчет или нет.
>>я хочу засечь, допустим, шесть часов с какого-то момента
когда этот момент наступит, запоминаем его в SO
при следующем старте используем для сравнения с текущим временем
вопрос-то в чем?
Кот Баюн
25.10.2014, 11:14
вопрос в том, что не знаю, как на практике прикрутить код от обычного таймера к SO.
опыта мало в этом.
А что та прикручивать-то? Записать в СО две цифирки - время старта и время длительности отсчета.
При запуске считываем, вычитаем и видим сколько ост.
function loadSettings( file, defaults ){
var answer = new Object()
var newset = SharedObject.getLocal( file )
if ( newset.data.dat != undefined )
{
trace(file+" ### Settings Loaded. OK")
answer = newset.data.dat
}
else
{
trace(file+" ### No Settings")
saveSettings( file, defaults )
answer = defaults
}
return answer
}
function saveSettings( file, obj ){
trace("### Save settings: "+file)
var saveset = SharedObject.getLocal( file )
saveset.data.dat = obj
saveset.flush()
}
var timerData = loadSettings("my_timer", {start:new Date(), finish:new Date()+10000})
По дефолту имеем данные для 10-секундного каунтдауна.
Для нескоькоих таймеров сохраняем не единичный объект, а массив объектов.
http://vk.com/TIMERS
Кот Баюн
25.10.2014, 12:35
Что-то я не совсем понял, куда они выводятся, цифры-то
Переменная timerData выдает значение [object Object]
timerData.start
timerData.finish
Кот Баюн
26.10.2014, 10:43
Интересно получается, старт у нас
Mon Oct 27 12:41:19 GMT+0600 2014
а финиш
Mon Oct 27 12:41:19 GMT+0600 201410000
что-то не так
Я на вскидку код даты кинул. Допилить до работоспособного состояния слегка неплохо бы.
Кот Баюн
26.10.2014, 17:32
так Date же стринговая, получается?
как ее превратить в число?
Вот интересно.... А что мешает заглянуть в хэлп по данному классу и почитать?
var A:Date = new Date()
trace(A)
trace(A.valueOf())
var B = A.valueOf()+10000
trace( new Date(B) )
trace( new Date(B).getSeconds() )
Добавлено через 6 минут
так Date же стринговая, получается?
как ее превратить в число?
Ну и к слову она НЕ стринговая. Это гигантский объект с огромной кучей свойств и мощных методов.
Кот Баюн
26.10.2014, 18:11
Тогда мне проще оперировать уже с Hour
Оперировать можно вообще с полным списком параметров.
Кот Баюн
26.10.2014, 19:14
Но мне таймер нужен только часовой.
Мне надо засечь несколько часов.
Попробую как-нибудь это прикрутить...
Ну вы блин даете... что там прикручивать-то?
var start:Date = new Date()
var finish = start.valueOf() + 60(минут)*60(секунд)*(кол-во часов каунтдауна)*1000
Для просветления разума :)
checkDat_ext_2.swf
Код во вложении не слишком красив, но все мыслимые извращения с датой там проделаны.
Кот Баюн
26.10.2014, 19:47
финиш выдает NaN
Если бы я каждый день программировал, я бы так не тупил)))
наверно....
Признаюсь, в программировании я полный пень))
несмотря на то, что учился на программиста... давно когда-то
Создайте новый ФЛА, и эскпериментируйте с трэйсами, пока не поймете как класс Дата работает.
Там много всего, но как только вникните в суть и познаете Дао, сразу увидиет, что все это яйца ломаного не стоит и все очень просто.
Добавлено через 1 минуту
финиш выдает NaN
А если так:
var estimatedHourWaiting = 1
var finish = start.valueOf() + 60*60*estimatedHourWaiting *1000
Кот Баюн
26.10.2014, 20:03
Создайте новый ФЛА, и эскпериментируйте с трэйсами,
Так ведь так же и сделал.
До этого догадался.
Там много всего, но как только вникните в суть и познаете Дао,
Уже 10 лет как пытаюсь смиренно познать сиё Дао.
Дальше if else не ушел пока.
А если так:
Выдает 1414429311531
Это правильное число?
По отношению к 6 часам?
Там как, миллисекундами меряет?
Яволь. Миллисекунды. В приложенной выше флэшке можно видеть как UNIX-время преобразуется туда сюда обратно и по всякому. Вообще-то почитать в Википедии про этот формат вполне возможно.
https://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F
Кот Баюн
26.10.2014, 20:56
а когда он отсчитает 6 часов, то что выдаст в trace?
О как..... Есть текущее время и БУДУЩЕЕ..... считаем разницу и показыаем отсчет...... Когда отсчитает, очевидно, что разница станет отрицательной :)
Соотв этот момент ндо отловить и .... ну тут вариантов масса :)
Вы оперируете не собственно ДАТОЙ, а разностными величинами. Которые надлежащим образом обрабатываете и отображаете......... Что он там выдаст - это вам решать и программить :)
Во вообще идеальный пример извращения.
Таймер на 35 сек. Вывод - в текстовый блок на стэйдже.
var targetDate:Date = new Date().valueOf()+60*60*1000*0.01;
onEnterFrame = function()
{
var DEC:Date = new Date( targetDate - new Date() )
out.text = DEC.getUTCHours()+":"+DEC.getMinutes()+":"+DEC.getSeconds()
out.text += "\n"+DEC.valueOf()
}
вопрос в том, что не знаю, как на практике прикрутить код от обычного таймера к SO.
опыта мало в этом.
var tf:TextField;
var curTime:Number;
var so:SharedObject;
var totTime:Number=6;
tf = this.createTextField("tf", 0, 0, 0, 200, 80);
so = SharedObject.getLocal("countdown", "/");
if (so.data.elapsedTime) {
// процесс уже запущен, стартуем счет
startCount();
} else {
//нет данных, создаем и ждем отмашки на старт (любой клик)
so.data.elapsedTime = 0;
tf.text = "кликните где-нибудь для старта";
this.onMouseDown = startCount;
}
function startCount() {
curTime = getTimer();
this.onEnterFrame = this_onEnterFrame;
this.onMouseDown = null;
}
function this_onEnterFrame() {
// добавляем время счетчику
var time:Number = getTimer();
so.data.elapsedTime += time-curTime;
curTime = time;
// показываем сколько прошло\осталось
var d:Date = new Date();
d.setTime(so.data.elapsedTime);
tf.text = "истрачено "+d.getUTCHours()+":"+d.getUTCMinutes()+":"+d.getUTCSeconds();
d.setTime(totTime*60*60*1e3-so.data.elapsedTime);
tf.text += "\nосталось "+d.getUTCHours()+":"+d.getUTCMinutes()+":"+d.getUTCSeconds();
}
Добавлено через 7 минут
упс
только это я почему-то написал для случая, когда счет при закрытии флешки останавливается, а при старте возобновляется снова
если надо, чтоб продолжался, то будет еще проще.., только до меня не доходит практический смысл такого счетчика, поэтому пусть так пока (если что переделать не сложно)
d.getUTCHours()+":"+d.getUTCMinutes()+":"+d.getUTCSeconds();
Икскьюзми, магистр (с), а использование ЮТС минут-секунд действительно имеет какой-то практический смысл, или это просто решение задачи в общем виде?
дада, это на случай когда нашей думе некуда уже будет часовые пояса двигать и они примутся за минутные и секундные :)
Понятно. Предусмотрительно :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.