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

Все постоянно ругают вейт, даже как то кто то кидал мне наработку, чтобы вейт не глючил, только наработка не работает.
Все твердят заменять таймером, как я понял, это то же самый таймер что только на локалках и без окна? Если вас хватит скиньте пример такого таймера, если возможно без использования хэш таблицы( я не понимаю ее смысл)
Буду заменять вейты))

WAIT_EX( 20. )
Что же ты раньше то молчал! А я голову ломаю! Все заработало!
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
Юзать структуры, свои собственные системы хранения данных.
Если вы только решили слезть с гуи+ вейты на jass, то вам рано думать о таком.
Таймер + хештаблицы в помощь, в статьях есть много информации на эту тему.
Что вам еще непонятно?
ImbaStyle, что есть TriggerSleepActions и timer вам известно?
ответ
Нельзя просто использовать таймер вместо вейта посередине триггера (гуишный вейт именно так и работает - запускает таймер и проверяет циклом каждые 0.1 сек пока он не пройдет).
Но если так уж нужно узнать истек ли таймер:
Real comparison - Обратный отсчет - Remaining time for timer (оставшееся время таймера)
ответ
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.

25
За 5 лет уже можно было найчиться и на джассе писать, и хеш-таблицами пользоваться, и всем остальным.
Вейт на длинных периодах нормально работает. Только для передачи данных придется использовать локалки.
33
Вот пример отсроченного действия и работы с таймером
Вот допустим у тебя вот так, юнит при появлении на карте, постоит 2 секунды и отправить в центр карты, допустим эта зачаток системы движения крипов, зачем тут вейт, ну например для создания эффекта какого-то, это уже не важно, просто вейт и всё.
Вот допустим переделываем это всё на таймер.
Опять таки в чистом гуи ты так не сделаешь, ну я просто не знаю как показать, поэтому покажу сразу как умею - на lua, джасс если вспомню то вспомню.
Сначала переведём всё это на код, на луа это будет выглядить примерно вот так
function Trig_Gui_Actions()
    TriggerSleepAction(2)
    IssuePointOrderLocBJ(GetTriggerUnit(), "move", GetRectCenter(GetPlayableMapRect()))
end

function InitTrig_Gui()
    gg_trg_Gui = CreateTrigger()
    TriggerRegisterEnterRectSimple(gg_trg_Gui, GetPlayableMapRect())
    TriggerAddAction(gg_trg_Gui, Trig_Gui_Actions)
end
На джасе также + появятся всякий лишний мусор
В целом перепишем всё это в 1 блок
do
    TimerStart(CreateTimer(), 0.12, false, function() -- это нужно чтоб сборщик не прибрал наше событие
        InitEvent()
    end)
    function InitEvent()
        local thisTrig = CreateTrigger()
        TriggerRegisterEnterRectSimple(thisTrig, GetPlayableMapRect())
        TriggerAddAction(thisTrig, function() -- в аот и первая анонимная функци
            local unit=GetTriggerUnit() -- вот он наш юнит
            TimerStart(CreateTimer(), 2, false, function() -- а вот и наша 2 анонимная функция
                IssuePointOrderLocBJ(unit, "move", GetRectCenter(GetPlayableMapRect())) -- а наше действие из гуи триггера
            end)
        end)
    end
end
всё, мы сделали тоже самое, на луа через таймер, без хештаблиц, сразу муи сразу без утечек, вру (тут таймер надо запаузить и уничтожить, чтобы прям идеально, но я этим принебрегаю)
Но ты скорее всего ничего не понял, и да я просто выделывался. Теперь же попробуем тоже самое сделать на JASS, будут писать прототип идо наизусьь джасс не помню, да что там, вообще его не помню
globals
	global unit GUNIT = null
endglobals

function Trig_Gui_Actions takes nothing returns nothing
   local timer t = CreateTimer() // создаём таймер
   call TimerStart( t, 2, false, function myTimer) // запускаем таймер
   set t = null // обнуляем локалку
endfunction

function myTimer takes nothing returns nothing //это функция  которую запускает таймер, в неё ничего нельзя передать, это это не луа, а убогий джасс тут нужны хештаблицы, я же использовал глобалку GUNIT 
	call IssuePointOrderLocBJ(GUNIT , "move", GetRectCenter(GetPlayableMapRect())) // тот же самый приказ идти в центр карты
	call PauseTimer(GetExpiderTimer()) // паузим
    call DestroyTimer(GetExpiderTimer()) // и убираем до конца, в принципи действия не обязательные, как я сказал выше
endfunction
Я тут немного обрезал убрал код action, но он прекрасно конвертится с гуи в джасс и остаётся там, остаётся добавить глобалку GUNIT, так же я спецом использовал локацию и утекающую точку, ибо это уже другая тема
Загруженные файлы
21
С ранних лет невзлюбил понятие "триггеный юнит" то есть тот, отношении которого подпадает действие конкретного триггера, а вариантов могутт быть миллионы. Варик может тупануть. Поэтому стараюсь конкретно использовать глобалку типтбоевая единица с его именем ваня там, маша, пися.
Центр области , приходться, хотя опять же говорили утечна область и лучше конкретно к какому то предмету идти или зданию.
Спасибо тебе, бергибир, только что я из того спообен понять?
Ну, щас сяду и попробую накидать вот это вот все в custom script, скорее всего работать не будет и я без понятия, зачем паузить запущеный таймер?! Как он посчитает, сколько времени мне нужно подождать?
Итог: это разбираться, зачем нужна хеш таблица и на примере ткакого нибудь заклинания где я уже видел таймер с хэшем , Как он отсрачивает события вместо вейта.
Опять же рефордж отдаютт аутсорсерам и может он ещё вернётся. Там видно будет, а пока только так
33
Рефордж я показывал просто для примера, на сколько там просто и не нужна никакие заморочки. Паузить и уничтожать одноразовый таймер, это обязательно иначе будет небольшая утечка в памяти (ибо это древний баг варкрафта), если таймер периодический, то разумеется его тоже надо будет остановить, дабы он не болтался без дела
21
Bergi_Bear:
Рефордж я показывал просто для примера, на сколько там просто и не нужна никакие заморочки. Паузить и уничтожать одноразовый таймер, это обязательно иначе будет небольшая утечка в памяти (ибо это древний баг варкрафта), если таймер периодический, то разумеется его тоже надо будет остановить, дабы он не болтался без дела
А Почему событие таймер истекает не срабатывает?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.