PDA

Просмотр полной версии : Таймер обратного отсчета на Shared Object


Кот Баюн
24.10.2014, 16:29
Всем доброго времени суток!
Возникла одна трудность.

Видел в Интернете исходники таймеров обратного отсчета, на которых можно засечь N часов-минут-секунд, вроде бы все понятно.
А как можно прикрутить такой таймер к SharedObject, чтобы после закрытия флешки отсчет продолжался?

Возможно для этого надо записать текущую дату-время и дату-время окончания таймера и сверять их при открытии флешки?

silin
24.10.2014, 21:19
что-то вы тут недоформулирвали: если после закрытия отсчет продолжается, то и сравнивать нужно текущее системное время с временем Ч, зачем нужно время закрытия предыдущей флешки ?

Кот Баюн
24.10.2014, 23:06
наверное недоформулировал.
ну короче говоря, примерно так.

я хочу засечь, допустим, шесть часов с какого-то момента, и чтобы после закрытия флешки таймер продолжал работать,

то есть, если открыть флешку через четыре часа, то он показывал бы, что два осталось.


Получается, записать в Shared Object начало и конец отсчета и отследить, идет отсчет или нет.

silin
24.10.2014, 23:30
>>я хочу засечь, допустим, шесть часов с какого-то момента

когда этот момент наступит, запоминаем его в SO
при следующем старте используем для сравнения с текущим временем

вопрос-то в чем?

Кот Баюн
25.10.2014, 11:14
вопрос в том, что не знаю, как на практике прикрутить код от обычного таймера к SO.
опыта мало в этом.

dark256
25.10.2014, 12:01
А что та прикручивать-то? Записать в СО две цифирки - время старта и время длительности отсчета.
При запуске считываем, вычитаем и видим сколько ост.

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]

dark256
25.10.2014, 19:54
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

что-то не так

dark256
26.10.2014, 12:51
Я на вскидку код даты кинул. Допилить до работоспособного состояния слегка неплохо бы.

Кот Баюн
26.10.2014, 17:32
так Date же стринговая, получается?
как ее превратить в число?

dark256
26.10.2014, 18:01
Вот интересно.... А что мешает заглянуть в хэлп по данному классу и почитать?

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

dark256
26.10.2014, 18:46
Оперировать можно вообще с полным списком параметров.

Кот Баюн
26.10.2014, 19:14
Но мне таймер нужен только часовой.
Мне надо засечь несколько часов.

Попробую как-нибудь это прикрутить...

dark256
26.10.2014, 19:42
Ну вы блин даете... что там прикручивать-то?

var start:Date = new Date()
var finish = start.valueOf() + 60(минут)*60(секунд)*(кол-во часов каунтдауна)*1000

Для просветления разума :)

checkDat_ext_2.swf

Код во вложении не слишком красив, но все мыслимые извращения с датой там проделаны.

Кот Баюн
26.10.2014, 19:47
финиш выдает NaN


Если бы я каждый день программировал, я бы так не тупил)))
наверно....
Признаюсь, в программировании я полный пень))

несмотря на то, что учился на программиста... давно когда-то

dark256
26.10.2014, 19:51
Создайте новый ФЛА, и эскпериментируйте с трэйсами, пока не поймете как класс Дата работает.
Там много всего, но как только вникните в суть и познаете Дао, сразу увидиет, что все это яйца ломаного не стоит и все очень просто.

Добавлено через 1 минуту
финиш выдает NaN


А если так:
var estimatedHourWaiting = 1
var finish = start.valueOf() + 60*60*estimatedHourWaiting *1000

Кот Баюн
26.10.2014, 20:03
Создайте новый ФЛА, и эскпериментируйте с трэйсами,
Так ведь так же и сделал.
До этого догадался.

Там много всего, но как только вникните в суть и познаете Дао,
Уже 10 лет как пытаюсь смиренно познать сиё Дао.
Дальше if else не ушел пока.

А если так:
Выдает 1414429311531
Это правильное число?
По отношению к 6 часам?
Там как, миллисекундами меряет?

dark256
26.10.2014, 20:06
Яволь. Миллисекунды. В приложенной выше флэшке можно видеть как UNIX-время преобразуется туда сюда обратно и по всякому. Вообще-то почитать в Википедии про этот формат вполне возможно.

https://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F

Кот Баюн
26.10.2014, 20:56
а когда он отсчитает 6 часов, то что выдаст в trace?

dark256
26.10.2014, 23:23
О как..... Есть текущее время и БУДУЩЕЕ..... считаем разницу и показыаем отсчет...... Когда отсчитает, очевидно, что разница станет отрицательной :)
Соотв этот момент ндо отловить и .... ну тут вариантов масса :)
Вы оперируете не собственно ДАТОЙ, а разностными величинами. Которые надлежащим образом обрабатываете и отображаете......... Что он там выдаст - это вам решать и программить :)

Во вообще идеальный пример извращения.

Таймер на 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()
}

silin
27.10.2014, 10:13
вопрос в том, что не знаю, как на практике прикрутить код от обычного таймера к 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 минут
упс
только это я почему-то написал для случая, когда счет при закрытии флешки останавливается, а при старте возобновляется снова
если надо, чтоб продолжался, то будет еще проще.., только до меня не доходит практический смысл такого счетчика, поэтому пусть так пока (если что переделать не сложно)

dark256
27.10.2014, 10:29
d.getUTCHours()+":"+d.getUTCMinutes()+":"+d.getUTCSeconds();


Икскьюзми, магистр (с), а использование ЮТС минут-секунд действительно имеет какой-то практический смысл, или это просто решение задачи в общем виде?

silin
27.10.2014, 10:49
дада, это на случай когда нашей думе некуда уже будет часовые пояса двигать и они примутся за минутные и секундные :)

dark256
27.10.2014, 17:55
Понятно. Предусмотрительно :)