Таймер код
|
|
FatalBlade | Дата: Суббота, 30 Июля 2011, 12:39:58 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Code local timer t local real r set t=CreateTimer() call TimerStart(t, 4, false, null) loop set r = TimerGetRemaining(t) exitwhen r <= 0 if (r > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * r) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t)
Это таймер, который используется как пауза в триггере. И не надо создавать новый триггер с событием Timer Expired. Но ведь тут тоже используется Wait (TriggerSleepAction). Этот код работает, но у меня вопрос: насколько он универсален? Будет ли он идеально работать, когда например он сидит в триггере, который является триггером для спелла. А герой который его кастует может получить другой приказ от игрока, или быть атакованным. Вообщем насколько он практичен в реальных условиях?
Сообщение отредактировал FatalBlade - Суббота, 30 Июля 2011, 12:58:27 |
|
|
|
Hexing | Дата: Суббота, 30 Июля 2011, 13:09:06 | Сообщение # 2 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| Code local timer t local real r set t=CreateTimer() call TimerStart(t, 4, false, null) loop set r = TimerGetRemaining(t) exitwhen r <= 0 if (r > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * r) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t) примерно равно PolledWait() эдакий таймер ест много ресурсов и очень неточен.
Quote И не надо создавать новый триггер с событием Timer Expired. если хочешь что бы всё работыло как надо, то нада
|
|
|
|
FatalBlade | Дата: Суббота, 30 Июля 2011, 13:32:58 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Ок и ещё 1 вопрос. Если не создавать каждый раз таймер (call CreateTimer) а потом удалять, а сразу всегда писать call StartTimer(глобальная переменная). Т.е. триггер не создаёт каждый раз новый таймер, а использует 1 и тот же. Удалять в таком случае его не надо (call DestroyTimer)?
|
|
|
|
FkoFF | Дата: Суббота, 30 Июля 2011, 14:27:08 | Сообщение # 4 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (FatalBlade) А герой который его кастует может получить другой приказ от игрока, или быть атакованным. Вообщем насколько он практичен в реальных условиях? собственно это развернутый polledwait ..>.<
|
|
|
|
Hexing | Дата: Суббота, 30 Июля 2011, 14:55:20 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| ну да, можно повешать на 1 таймер много событий.
|
|
|
|
SirNikolas | Дата: Суббота, 30 Июля 2011, 16:12:59 | Сообщение # 6 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (FatalBlade) тут тоже используется Wait (TriggerSleepAction). Этот код работает Пока работает. Но может полететь в любой момент.
Если код не может выполняться дважды в одно и то же время, и при этом выполняется достаточно часто, а не раз в пять минут, имеет смысл сделать глобальный таймер.
|
|
|
|
FatalBlade | Дата: Суббота, 30 Июля 2011, 16:40:40 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| call TimerStart(t, 0.3, false, null) set r = TimerGetRemaining (t) loop exitwhen r<=0 set r = TimerGetRemaining (t) endloop
А как вот это?Добавлено (30-07-2011, 16:40) --------------------------------------------- Как использовать локальный таймер? Шаблон плз, я уже сам разберусь что к чему. Если он локальный, значит не нужно создавать ещё 1 триггер, а значит всё проиходит в одном триггере. call TimerStart(t, 0.3, false, null) Дальше что? Какие условия? Какие действия? Какой цикл если он нужен?
|
|
|
|
Hexing | Дата: Понедельник, 01 Августа 2011, 14:07:18 | Сообщение # 8 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| Code call TimerStart(t, 0.3, false, null)
можно создать событие TimerExpired, но можно сделать так:
... Code call TimerStart(t, 0.3, false, function MyFunction) // TimerStart(<имя таймера>,<период через который выполняется указанная функция или вызывается событие повешанное на таймер через TimerExpired>,<false - //таймер сработает 1 рази иначе бесконечность или пока не застопить его>,<null - никакая функция не будет вызвана иначе "function SomeFunction" - будет вызвана //функция SomeFunction>) ... Code function MyFunction takes nothing returns nothing //твои действия, выполняемые каждые 0.3 секунды. точнее поскольку в паарметр periodic ты передал false, по истечении 0.3 сек эта функция будет вызвана и больше не будет. endfunction
вроде норм обьяснилДобавлено (01-08-2011, 14:07) --------------------------------------------- Движок варика устрое таким образом, что игровой таймер, отрабатывающий в идеале 1000 раз в секунду, а на деле ~ 100 раз, пробегается по всем "таймерам" и увеличивает значение времени, а значит на такие имитируемые таймеры можно повешать сразу много событий любого периода(даже не кратного).
|
|
|
|
FatalBlade | Дата: Понедельник, 01 Августа 2011, 14:44:15 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Hexing) Движок варика устрое таким образом, что игровой таймер, отрабатывающий в идеале 1000 раз в секунду, а на деле ~ 100 раз, пробегается по всем "таймерам" и увеличивает значение времени, а значит на такие имитируемые таймеры можно повешать сразу много событий любого периода(даже не кратного). Но всё равно если повесить много событий оно заметно. Конечно в моей карте такого не случится, но вот например делал бы я ТД или Футмен....
|
|
|
|