Сейчас 08:27:56 Пятница, 29 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Таймер код
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 раз, пробегается по всем "таймерам" и увеличивает значение времени, а значит на такие имитируемые таймеры можно повешать сразу много событий любого периода(даже не кратного).

Но всё равно если повесить много событий оно заметно. Конечно в моей карте такого не случится, но вот например делал бы я ТД или Футмен....


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz