Добавлен SсRealm
Здравствуйте. Сделал простое окно таймера и оно работает. Чтобы не вызывать отдельные события по истечению таймера вчерез другой триггер, сделал внутри ожидание через wait ex. Таймеор и окно работает, но иногда по истечению времени окно не закрывается и висит еще лишние секунд 15, в чем моя ошибка?
unction Trig_ReadyTime_Actions takes nothing returns nothing
local real Timerivan
local timer IvanTimer
local timerdialog IvanWindow
set Timerivan = 60.00
set IvanTimer = CreateTimer()
IvanTimer=bj_lastStartedTimer
call StartTimerBJ( IvanTimer, false, Timerivan )
call CreateTimerDialogBJ( IvanTimer, ( "Следующая волна:" ) )
set IvanWindow = bj_lastCreatedTimerDialog
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[1] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[2] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[3] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[4] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[5] ))
call TimerDialogDisplayBJ( true,IvanWindow )
call WAIT_EX(60.)
call TimerDialogDisplayBJ( false,IvanWindow )
call DestroyTimerDialogBJ( IvanWindow )
call TriggerExecute( gg_trg_Wawe )
set IvanTimer =null
set IvanWindow=null
endfunction
===========================================================================
function InitTrig_ReadyTime takes nothing returns nothing
set gg_trg_ReadyTime = CreateTrigger( )
call TriggerAddAction( gg_trg_ReadyTime, function Trig_ReadyTime_Actions )
endfunction
local real Timerivan
local timer IvanTimer
local timerdialog IvanWindow
set Timerivan = 60.00
set IvanTimer = CreateTimer()
IvanTimer=bj_lastStartedTimer
call StartTimerBJ( IvanTimer, false, Timerivan )
call CreateTimerDialogBJ( IvanTimer, ( "Следующая волна:" ) )
set IvanWindow = bj_lastCreatedTimerDialog
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[1] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[2] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[3] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[4] ))
call TimerDialogDisplayForPlayerBJ( true,IvanWindow, GetOwningPlayer(udg_Hero[5] ))
call TimerDialogDisplayBJ( true,IvanWindow )
call WAIT_EX(60.)
call TimerDialogDisplayBJ( false,IvanWindow )
call DestroyTimerDialogBJ( IvanWindow )
call TriggerExecute( gg_trg_Wawe )
set IvanTimer =null
set IvanWindow=null
endfunction
===========================================================================
function InitTrig_ReadyTime takes nothing returns nothing
set gg_trg_ReadyTime = CreateTrigger( )
call TriggerAddAction( gg_trg_ReadyTime, function Trig_ReadyTime_Actions )
endfunction
Принятый ответ
По сути тут мы проверяем каждые 0.1 сек, когда там таймер завершится (с помощью call TriggerSleepAction(0.1)), и дальше закрываем окно. Все локально, в одном коде без дополнительных событий. Не сказать, что прямо оптимизированно и точно, но для твоей задачи сгодится. Если надо более точное время - ставишь не 0.1 а 0.01 или 0.05 к примеру.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Так-же мне показалось много странного в коде. Ты сам сможешь объяснить каждую строку, зачем она нужна, вот тут к примеру:
А на переодическое событие "таймер истекает", если с другого триггера это фиговая идея, мне кажется, потому что оно само по себе может не срабатывать, у меня сто раз так было. Поэтому ожидание и запихнул в таймер
Ну напишу я set IvanTimer= udg_IvanTimer но это создаст ту же проблему(
Ред. konvan5
Ред. host_pi
делай в глобалку - timerdialog td=null , тогда окно будет удаляться
даже если в глобалку напишешь timerdialog td - то не будет удаляться, надо с null
call PauseTimer(t)
call DestroyTimerDialog(td)
как ты там их вообще останавливаешь
и да, окно и таймер не связаны, т.е. после удаления только окна - таймер продолжит тикать
кури коменты тут xgm.guru/p/wc3/Kak-obnulit-dannyy-tip-peremennoy-iXc/comments/vi...
local timer t = CreateTimer()
call TimerStart(t,s,false,null)
loop
call TriggerSleepAction(s)
exitwhen TimerGetRemaining(t) == 0.
endloop
call DestroyTimer(t)
set t = null
endfunction
Ред. host_pi
кури тут xgm.guru/p/wc3/kak-sdelat-3-raznykh-deystviya-s-odnoy-periodi-Nx...
Ред. konvan5
Как не зайдешь на ХГМ - все все на свете знают, а я всегда не прав. Пойду дальше делать карту. Всем спасибо, вопрос закрыт.
В идеале еще предоставишь карту, как у тебя работает. Можешь вынести весь нужный код в отдельную пустую карту, чтобы мы могли потестить твой случай и сказать в чем ты не прав, ибо по скринам не всегда понятно, что у тебя пошло не так ибо может быть ты не всю информацию нам предоставляешь.
Тестовая карта. Через 10 сек появляется волна и она то задерживается после таймера, то нет. После частого запуска варика( проверки карты ) ошибка с задержкой таймера перед первой волной повторяется. Если тестить отдельный таймер по той же схеме, то с воскрешением героев ошибки нет
Ред. konvan5
Поэтому запускай триггер по событию "время прошло". Хотя бы 0.01 сек ставишь и уже не в инициализации запускаешь триггер.
Типа так:
Без отдельного триггера с событием.
К примеру если у тебя карта лагает, время может замедлятся/ ускорятся внутри игры, а вот системное будет стабильное. Помню уже были подобные проблемы со временем.
Давно была идея, чтобы игроки докупали время перерыва, если им это необходимо. В wait ex это сделать было бы проблематично, а тут вполне можно попробовать))😊
Ред. ScorpioT1000