RU

Таймер. Несколько видов таймера в играх.

ejikplains #2161 17.02.2018 00:25 5 comments 6660 views

Данной темы нет, поэтому время и мне внести вклад в разработку и помочь новичкам этой статьей. Данная статья написана максимально понятным языком. Понимаю, Nex, не всем нравится таймер. Но как и было тобой сказано на всё воля автора.
Для начала стоит понимать, что локация $COUNTER - это одноразовый код, который исполнится вам с установленным промежутком времени SETTIMER(в миллисекундах). время указывать до объявления локации.
Создаем локацию таймера и назовём её как захотим. к примеру - counter. Далее в нужной нам локации ставим время, через которое будет исполнен код указанной локации и название(если SETTIMER не указать, то по умолчанию 1 секунда).

SETTIMER 2000
$COUNTER = 'counter'

Код сверху означает, что локация выполнится через 2 секунды(2000 миллисекунд).
локация $COUNTER одноразова только в тех случаях, когда мы не возвращаемся на данную локацию вновь. Если вам нужно сделать так, чтобы она один раз сработала и больше не включалась даже по возвращению или обновлению локации, тогда делаем так:

if a = 0:
	SETTIMER 2000
	$COUNTER = 'counter' 
	a = a + 1
end

Итак, ниже представлены три распространенных таймера в играх.
1)Таймер без вывода на экран пользователю времени:
Взорви зомби
В данном примере мини игра содержит таймер внутри. Вы не видите его на экране, но время тикает))).
2)Таймер с выводом времени на экран пользователю:
taymer_s_vyivodom_vremeni.qsp
В данном примере игроку показывается обратный отсчёт времени. Можно в начале игры сделать это как константу, заменить в обратном направлении секунды и, по завершению игры, показать игроку сколько времени он играл.
3)Таймер с зависимостью пути от времени.
17022018-0324_mini_igra_vernyiy_put.qsp
Данная мини игра демонстрирует зависимость пути от времени. Данный вид таймера нужен для того, чтобы что-то менялось в режиме реального времени в зависимости от самой игры, а не от игрока. Время в settimer можно контролировать при помощи

vremya = 1000
settimer <<vremya>>

Таким образом можно в зависимости от действий как добавлять время игроку, так и убирать его.
Так же данный вид таймера нужен для спидран игр.
Остальные нужные вам таймеры можно сделать самостоятельно на основе этих.

Aleks Versus Moderator 17.02.2018 07:53 (8 years ago)

ejikplains,
по умолчанию, 500 мс. Т.е. пол секунды.

ejikplains:

Код сверху означает, что локация выполнится через 2 секунды(2000 миллисекунд).

код локации будет выполняться КАЖДЫЕ две секунды.

ejikplains:

Если вам нужно сделать так, чтобы она один раз сработала и больше не включалась даже по возвращению или обновлению локации, тогда делаем так:

и опять таки нет. Вот это ты пишешь на самой первой локации игры, или там, где тебе действительно уже нужно запустить таймер:

SETTIMER 2000 
    $COUNTER = 'counter'
! заодно можно поставить запрет на выполнения кода в counter
a=1

А это уже код в counter

if a = 0:
! если не стоит запрет 
     !выполняем какой-то код
    ! например увеличиваем время (значение переменной отсчитывающей секунды)
    sec=sec+2
    ! если хотим, возвращаем запрет на дальнейшее выполнение кода в counter
    a = a + 1
end

И опять таки, если воспользоваться поиском по форуму, можно найти тему Действие по таймеру

Перед выкладыванием тестировал код со всех сторон и пришел к выводу, что (возможно, не возьмусь утверждать) $counter работает по принциру gosub, но с отсрочкой. Повторного исполнения кода не замечал (опять же не утверждаю). Пример с if действительно коряв. Только сейчас увидел. Поправлю.
Что касаемо поиска: он не столь информативен был на данную тематику, чем пример nex’a с игрой, где сообразил сразу что и куда. К тому же добавил три вида реализации таймера. Это будет полезно многим.
Инфу отредактирую. Спасибо за критику)))

ejikplains,
Для проверки достаточно будет в счётчике написать:

counter_time+=1
*clr
'Время идёт: <<counter_time>>'

Неожиданно, но код продолжает работать, а не выполнится одноразово.

Oliver,
В пн вернусь и отредактирую. Я понял что ты имеешь в виду. Одно до сих пор не понятно: при повторном обращении в каунтеру без указания времени, settimer дефолтный или остается тем, что указан однажды на протяжении всей игры? И убивает ли kilall время или останавливает его?

Aleks Versus Moderator 17.02.2018 19:03 (8 years ago)

ejikplains,
внимательнее читай справку.

settimer устанавливает периодичность обращения к counter.

ставишь 500 — раз в пол секунды выполняется код на counter
ставишь 2000 — раз в две секунды. Не один раз через две секунды, а КАЖДЫЕ две секунды.

Время убить нельзя. Поскольку settimer это оператор, а не переменная, значение, которое ты ему передаёшь, не убить.

Легко проверить. Самая первая локация в игре:

$counter = 'counter'
settimer 2000

локация counter

sec+=2
*clr
*pl sec
if sec=10:
 killall
 sec=12
 $counter='counter'
end

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

Log in or Register to post comments.