АвторСообщение



Сообщение: 3
Зарегистрирован: 10.06.15
ссылка на сообщение  Отправлено: 12.06.15 01:45. Заголовок: Идея Независимого Таймера


Кто нибудь уже пробовал сделать таймер внутри Урки, что бы он работал, даже когда программа выключена? Меня давно заинтересовало, можно ли в Урке сделать независимое время (его можно использовать, что бы, например построить что-то, или зарядить). Пробовал использовать команду Pause, но она перестает работать, даже когда просто окно игры не активно. Потом узнал о переменной Time, хранящая число секунд (а точнее тысячных долей секунд) "прошедших с полуночи". Так вот дело в том, что она не зависит от самой Урки, и даже от времени на компьютере! И я ее использовал, что бы создать свой таймер, совершенно безошибочный и работающий независимо от Урки. Надеюсь я не изобрел велосипед =)

:click ;Значит, тут мы начинаем. 
pln Что бы начать, нажмите кнопку ниже
btn start_time, Старт
end

:start_time ;Сюда мы попадаем только один раз за игру
first_t=#time$ ;Тут мы фиксируем момент, в который мы начали играть. Переменная FIRST_T может содержать любые цифры, например 53617394.
cls ;Чистим экран.
pln Загрузка... ;Это просто, чтобы заполнить чем-то пустоту, неважно, можно стереть.
pause 1000 ;Делаем паузу в одну секунду, не обязательно, но будет полезно.
save refresh ;Сохраняемся. Как можно заметить, сохраняется только одна переменная FIRST_T, значение остальных нам сохранять не нужно.
:refresh
cls ;Как всегда чистим экран, из за очистки сразу после сохранения, мы не увидим сообщения о сохранении.
if hour<10 then p 0#hour$ : else p #hour$ : ;Здесь будет выведен на экран сам интерфейс часов.
if min<10 then p 0#min$ : else p #min$ : ;Дело в том, что если например прошло пять минут, мы хотим видеть не 0:5:0, а 00:05:00.
if sec<10 then pln 0#sec$ else pln #sec$
time_part=0 ;Эта переменная нам понадобится позже.
second_t=#time$ ;Тут мы фиксируем наш второй момент. Это происходит чуть больше чем через секунду после первой.
dif=#second_t$-#first_t$ ;В переменную DIF записывается разница этих двух переменных. Эта разница и есть прошедшее время (пока она равна секунде с лишним)
instr tokens_delim=char ;После этой команды токены будут делить строки на символы.
instr calc=#dif$ ;Переписываю переменную DIF (которая хранит разницу во времени) в CALC. Дело в том, что команда TOKENS делит только содержимое переменной, записанной с INSTR.
tokens calc ;Делим переменную CALC на символы, тоесть на отдельные цифры в нашем случае.
if tokens_num=3 then goto start_time ;Последние три цифры - это десятые, сотые и тысячные доли секунды. Если в нашей разнице всего три цифры, значит прошло еще менее секунды, а значит, мы будем возвращаться до тех пор, пока не пройдет секунда.
if tokens_num=8 then numb=#%token1$#%token2$#%token3$#%token4$#%token5$ ;Эти пять строк нужны, что бы избавится от долей, и оставить только секунды, в зависимости от того, сколько символов в нашей переменной CALC.
if tokens_num=7 then numb=#%token1$#%token2$#%token3$#%token4$
if tokens_num=6 then numb=#%token1$#%token2$#%token3$
if tokens_num=5 then numb=#%token1$#%token2$
if tokens_num=4 then numb=#%token1$

instr tokens_delim=. ;Теперь разделителем строк будет точка.
:find_time ;Теперь нам осталось перевести секунды в часы, минуты и секунды.
time_part=time_part+1 ;Создаем цикл.
if time_part=1 then del=#numb$ else del=#%token1$ ;Если мы тут в первый раз, переменная DEL равна разнице во времени. В противном случае, она равна целому числу (будет понятно позже)
dec=#del$/60 ;Делим это число на 60, что бы перевести секунды в минуты (если мы тут второй раз, то из минут в часы). Например 123/60=2.05
instr tok_dec=#dec$ ;Переводим DEC в TOK_DEC, опять же, из за работы токенов.
tokens tok_dec ;Делим частное от нашего деления на целые числа, и дробь (Наш пример, 2 - целое, 05 - дробь).
mult=#%token1$*60 ;MULT равняется целому числу, помноженному на 60 (Именно это целое число используется при повторе цикла). В нашем примере - 2*60=120.
if time_part=1 then sec=#del$-#mult$ & goto find_time else min=#del$-#mult$ & hour=#%token1$ ;В первый раз, секунды - это разница нашего изначального числа и MULT, затем повтор цикла. Во второй раз вместо секунд - минуты, а часы, это целое число.
pause 1000 ;Пауза, без нее не обойтись!
goto refresh ;Возвращаемся к интерфейсу таймера с новыми числами.

Если вы мало что поняли, вот логические размышления:Мы берем момент времени, например 73561394. Теперь возьмем второй момент времени, отличающийся от первого, скажем - 73738752. Вычитая второе из первого, получаем то, сколько времени прошло между этими моментами. 73738752 - 73561394 = 177358 Последнее число - тысячные доли секунды, затем сотые, десятые. Четвертое число СПРАВА - секунды, левее десятки, сотни, тысячи и десятки тысяч секунд
1 7 7 3 5 8
<---|------->
| - положение секунды, все что правее ее, дроби, нам не нужно.
У нас остается 177 секунд. Значит, между первым моментом и вторым прошло 177 секунд. Теперь используем деление столбиком (именно на этом основано деление в моем коде). Делим 177 секунд на 60, что бы получить минуты.
Получаем 2.95 Теперь берем целое число, 2, и умножаем на 60, получаем 120.
И наконец вычитаем из 177 число 120, и остаток равен 57. Таким образом - остаток это секунды, а то целое число, что мы умножали на 60 - минуты. Ответ - разница между первым и вторым моментом времени - 2 минуты, 57 секунд.
Теперь делаем паузу на секунду, берем новый второй момент времени, и повторяем все сначала.

Дело в том, что когда мы берем второй момент времени, мы основываемся на секундах, которые тикают внутри самого компьютера, и, вычитая их из первого момента, мы находим, сколько времени прошло между ними. Остается, только одна проблема, которую я пока не решил - это то, когда число в переменной TIME возвращается к нулю. Если это произойдет, то мой таймер сломается. Однако это можно решить, если я буду знать, какое самое большое число, после которого переменная обнуляется. Да, к тому же, более двух суток таймер работать не сможет точно. Короче я тут поразмышлял, поделился своими мыслями. Вы мне скажите, если это чего-то стоит, или такое уже давно есть.


Спасибо: 0 
Профиль Цитата Ответить
Ответов - 1 [только новые]





Сообщение: 5
Зарегистрирован: 10.06.15
ссылка на сообщение  Отправлено: 12.06.15 03:10. Заголовок: Узнал, что, к сожале..


Узнал, что, к сожалению, переменная TIME обнуляется при включении компьютера...

Спасибо: 0 
Профиль Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 267
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет