Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Время/Дата v. 6.1 Финальная Версия

Время/Дата v. 5.6 8 года 8 мес. назад #83705

  • Luar_Zero
  • Luar_Zero аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 496
  • Спасибо получено: 1134
  • Учитель2 место ГотвХудожникПобедитель конкурса маппинга2 место 3 местоПобедитель конкурса1 место в ГотвЗа 2 место на конкурсе маппинга
Котейка пишет:
А можно ли сделать так, чтобы день проходил быстрее ночи?

Вы извините, что влезаю не в свой калашный ряд, но даже я (а все знают, насколько я криворук и бестолков в отношении скриптов) заметил строчку:

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 8 года 8 мес. назад от Luar_Zero.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Ren310

Время/Дата v. 5.6 8 года 8 мес. назад #83707

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • Даритель Стимкея2 место 2 место Сбитая кодировкаПереводчикПрограммист RubyОрганизатор конкурсов
Тов. Луар, это же только к Касу да его освещению.
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83708

  • Luar_Zero
  • Luar_Zero аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 496
  • Спасибо получено: 1134
  • Учитель2 место ГотвХудожникПобедитель конкурса маппинга2 место 3 местоПобедитель конкурса1 место в ГотвЗа 2 место на конкурсе маппинга
Стрелок, вот видишь... Все-таки зря я влез))
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83711

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • 2 место Сбитая кодировкаПобедитель Сбитой кодировкиПроект месяца 3 место3 место Готв3 местоОрганизатор конкурсовПрограммист JavaScript 2 место Проект месяца 2 местоПисатель 3 место
Речь о том, чтобы игровое время днём шло быстрее, чем ночью (например, ночью - 1 игровая минута за 10 реальных секунд, днём - за одну), или о том, чтобы день содержал меньше 12 игровых часов? Если второе - то это настраивается в блоке Tints, фактически.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: strelokhalfer

Время/Дата v. 5.6 8 года 8 мес. назад #83712

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • Даритель Стимкея2 место 2 место Сбитая кодировкаПереводчикПрограммист RubyОрганизатор конкурсов
Нет, как я понял, первое нужно.
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83716

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Koteuka пишет:
А можно ли сделать так, чтобы день проходил быстрее ночи?
Сейчас нельзя сделать, чтобы ночью время шло быстрее. Если вопрос относится только к освещению, то это настраивается в скрипте, как выше сказал Cerberus
Последнее редактирование: 8 года 8 мес. назад от DK.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83721

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Нужно было хранить метку времени (Time.now.to_i) и от него уже плясать (Time.at timestamp чтобы получить обратно время из метки), а не полагаться на точность Grphics.update. В мейкере есть порочная практика дергать метод wait, например во время проигрывания анмации, или вывода сообщений в стандартной боевке. Это будет вносить погрешности в работу твоих часов, т.к. Grphics.update притормаживается.
Последнее редактирование: 8 года 8 мес. назад от Iren_Rin.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK, Ren310, strelokhalfer

Время/Дата v. 5.6 8 года 8 мес. назад #83735

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Конкретно Graphics.update я нигде не использую. Вызвал через событие ожидание 900 кадров - время шло в обычном режиме. Я использую Graphics.frame_count, которое вроде как не зависит от wait
Последнее редактирование: 8 года 8 мес. назад от DK.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83737

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Имеется ввиду update у всех сцен.
Сделай эксперимент - в update любой сцены, да и хоть в update своих часов сделай sleep 120. Посмотри результат.
Последнее редактирование: 8 года 8 мес. назад от Iren_Rin.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83738

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Но sleep и wait это не одно и то же... Sleep, конечно же, будет влиять на скрипт, даже не смотря на то каким способом сделано обновление, wait же не влияет на frame_count, а ты сам сказал выше, что именно wait любят вызывать другие скриптеры, так что я считаю, что мой скрипт работает правильно. Пришли тогда демку со своим вариантом, может я тебя неправильно понял как - то.

UPD: Может ты все - таки имел ввиду сделать в update не sleep 120, а Graphics.wait(120)? Если да, то тут никакой Time.now.to_i и прочее не спасут, потому что пока он не сделает свой wait, другие скрипты ничего сделать не смогут...
Последнее редактирование: 8 года 8 мес. назад от DK.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83743

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Ты используешь update методы сцен (Я подозреваю, что update сцен вызывается из Graphics.update, но ручаться не могу). Через них ты добавляешь секунды к своим часам и надеешься, что метод update дергается ровно 60 раз в секунду. Это не всегда так. Бывает, что спрайтов в сцене очень много, их их физически нельзя все обновить за 1/60 секунды. Бывает, что на update сцен завязывают не только обновление спрайтов. Твои часы тому доказательство, да и я так делаю в своем Ticker. Слабый компьютер это только усугубит. Фактически, в любой игре, где FPS не строго 60, полагаться на такой счетчик - ненадежно.
Я сказал тебе про sleep для примера такого длительного update. По поводу wait - скорее всего он увеличивает счетчик Graphics.frame_count, но во время ожидания update у сцены не вызывается. Т.е. ты можешь запросто не добавить секунду во время. Это будет больше всего заметно в стандартной боевке, там в Window_BattleLog очень много вызовов wait.

Я сделал демку. Там несколько десятков параллельных событий и проигрывание анимации.
Скрин проблемы
Демка с проблемой

Как это можно поправить.
Часы показывают разницу времени между началом отсчета и текущим моментом. Положи в переменную метку времени на момент запуска часов (@time = Time.now.to_i). Все что тебе нужно знать во время обращения за текущим временем - сколько времени пользователь установил вначале и сколько секунд прошло со времени запуска часов (Time.now.to_i - @time). Из реальных секунд ты можешь всегда посчитать все остальное.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: strelokhalfer

Время/Дата v. 5.6 8 года 8 мес. назад #83744

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • 2 место Сбитая кодировкаПобедитель Сбитой кодировкиПроект месяца 3 место3 место Готв3 местоОрганизатор конкурсовПрограммист JavaScript 2 место Проект месяца 2 местоПисатель 3 место
update сцен вызывается из SceneManager (через main). А Graphics.update - из них, точнее, из Scene_Base.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: strelokhalfer, Iren_Rin

Время/Дата v. 5.6 8 года 8 мес. назад #83745

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
def wait(duration)
duration.times { update }
end
Да, frame_count увеличивается в update.
Если использовать реальное время в скрипте, то можно заметить такое же отставание моего времени от реального, потому что графика нагружает систему, поэтому что использовать frame_count что не использовать - все зависит от нагрузки на систему.
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

Знаешь, как этого добиться? Сделать ненадолго окно консоли активным, а потом вернуться в игру...
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83746

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Приписка про "реальные секунды" там не для красного словца. Убрав в фокус с окна игры ты остановил апдейт всех сцен (а ведь можно представить это как большой лаг в игре) и, как следствие и свои часы. Тем не менее реальное время остановить не так просто :D
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: strelokhalfer

Время/Дата v. 5.6 8 года 8 мес. назад #83747

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Ну, а мне же надо обновление только в игре. А то убрал на время фокус с игры, вернулся, а у тебя + час в игре и вероятность словить баги... Ну, если в игре будет большой лаг, как ты говоришь, что все сцены остановились, то и остановка времени будет логичной... А то графика заморозится, а время будет идти? Другие баги пойдут
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83748

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Было бы желание пофиксить. Например на update записывать иногда последнее время обновления (например раз в 30 фреймов) и фиксировать разницу между этими записями. Во время расчета делать поправку на сумму разниц больше n секунд. Как бы после сохранения и выхода из игры, и до следующей загрузки пользователь тоже ожидает, что время в игре не идет.
Я не предлагаю тебе готовое решение проблемы, просто идею, как это МОЖНО починить. Это твой скрипт, тебе решать как он должен работать. Только если решишь оставить трек на фреймах - лучше убери возможность смотреть время в битве. Вангую, что там будут потери в секунд так 10 за каждую минуту активной битвы.

Это мое последнее сообщение по поводу этой проблемы. Я потратил кучу времени и даже демку сделал, а толку пока нет :(.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK

Время/Дата v. 5.6 8 года 8 мес. назад #83749

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Конечно же хочется сделать всё без задержек, но, как оказалось, Time.now не подходит для этого, так что надо это обдумывать. Просто мне кажется, что в принципе невозможно избавиться от этой задержки, потому что можно так нагрузить игру спрайтами, что будет 1 фпс...даже, если я буду просто добавлять секунды без всяких условий, то задержка все равно будет...
Спасибо за потраченное время.

UPD: Как мне кажется, я нашёл доказательство своим словам: на твоей демке убрал условие в update часов, убрал обновление в Scene_Map, сделал alias update в модуле Graphics и перед ним вызываю обновление времени. Казалось бы, что перед обновлением графики он должен обновлять время правильно, но даже в этом случае есть задержка в 1-2 секунды...
Последнее редактирование: 8 года 8 мес. назад от DK.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83756

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Возникла необходимость в скрипте, который бы отсчитывал время пользователя в игре только когда активны некоторые сцены. Т.е. время не в игре, или когда игра не в фокусе трекать нельзя. Пришлось написать и вот проект на гитхабе. Считает точно, независимо от нагрузки на систему, wait и т.п.
P.S. Я знаю, что я говорил, что не буду писать больше по этой проблеме тут. Однако "в принципе невозможно избавиться" прозвучало как вызов :)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK, Ren310, strelokhalfer

Время/Дата v. 5.6 8 года 8 мес. назад #83757

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Проект месяца 2 местоДаритель СтимкеяПаладинУчительПроект месяца 3 местоПрограммист JavaScript ОраторПрограммист RubyРазработчикВетеран
Я тебе никакой вызов не бросал :)
Да, я оказался не прав, и у тебя получилось это сделать. Если хочешь, то можешь прикрутить к моему скрипту, у меня пока нет возможности выкладывать скрипты на сайт :(
P.S. Запихнул твой скрипт в твою демку, вызвал wait больше 20 - потерял одну секунду.
UPD: протестировал на слабом компе, где в демке выдает 4 fps - за 90 реальных секунд было 55 скриптовых.
Последнее редактирование: 8 года 8 мес. назад от DK.
Администратор запретил публиковать записи гостям.

Время/Дата v. 5.6 8 года 8 мес. назад #83758

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • КоммерсантУчительПроект года 1 местоПроект месяца 1 местоПрограммист Ruby
Потому что настраивать нужно изходя из проекта. Если у тебя есть такие фризы, то нужно УВЕЛИЧИТЬ это время.
Последнее редактирование: 8 года 8 мес. назад от strelokhalfer.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.306 секунд