XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
LostCoast

offline
Опыт: 2,633
Активность:
Нужна помощь.Снизу приведен пример, по странным причинам он не хочет создавать мне юнита, хотя метод begin работает. Что самое интересное если функцию Con1 вызвать не с помощью таймера а через call, и в Con1 поставить цикл который 3 раза вызовет метод start то все работает, единственная проблема если в цикле поставить PolledWait, то он срабатывает 1 раз. Можете мне обьяснить в чем проблема, почему стартуя таймеров не создается юнит, если что я новичек в vjass'е.


» раскрыть
Код:
scope Test initializer Init

globals
integer i = 0
endglobals


struct Test
    real num = 0.
    timer t
    unit u

        static method begin takes nothing returns nothing
            local Test data = Test(GetTimerData(GetExpiredTimer()))
            set data.num = data.num + 1
            call BJDebugMsg(R2S(data.num))
            if data.num >= 5 then
                call data.destroy()
            endif    
        endmethod
        
        static method start takes location s returns Test
            local Test data = Test.allocate()
            set data.t = NewTimer()
            set data.u = CreateUnit(GetTriggerPlayer(),'h002',GetLocationX(s),GetLocationY(s),bj_RADTODEG  )
            
            call SetTimerData(data.t,data)
            
            call TimerStart(data.t,.5,true,function Test.begin)
            return data
        endmethod
        
        
        method onDestroy takes nothing returns nothing
            call ReleaseTimer(.t)
        endmethod
endstruct

function Con1 takes nothing returns nothing
    local Test t
    local location s = GetSpellTargetLoc()        
    set t = Test.start(s)
    set i = i + 1
    if i >= 3 then
        call ReleaseTimer(GetExpiredTimer())
        call t.destroy()
    endif 
endfunction



function Con takes nothing returns boolean
    local timer t = NewTimer()
        if  GetSpellAbilityId() == 'A000'  then
            call TimerStart(t , .5,true,function Con1)
        endif
        return false
endfunction


function Init takes nothing returns nothing
    local trigger Testt = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( Testt, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( Testt, Condition( function Con ) )
endfunction

endscope

Отредактировано LostCoast, 18.09.2011 в 21:40.
Старый 18.09.2011, 21:21
Doc

offline
Опыт: 63,163
Активность:
Т_Т и где ты возьмешь GetSpellTargetLoc в совершенно другом потоке?
Старый 18.09.2011, 21:26
LostCoast

offline
Опыт: 2,633
Активность:
Doc, не суть , в полном коде вот такой метод.

static method Create takes unit caster, real xtt,real ytt returns BulletData

подправил код.
Старый 18.09.2011, 21:36
Doc

offline
Опыт: 63,163
Активность:
LostCoast, Т__Т и где ты возьмешь GetSpellTargetLoc в совершенно другом потоке?
Осторожно намекаю на таймер.
Старый 18.09.2011, 21:42
LostCoast

offline
Опыт: 2,633
Активность:
Faion, я хочу пока что на vjass научится писать, хочу структуры научится делать. лучше помоги мне))просто иногда очень весело понимать что твой код написан без ошибок но в игре он не работает так как надо(

LostCoast добавил:
Doc, попробовал не работает, что самое интересное все работает если поставить цикл и запустить функцию не таймером и просто её вызвать, только цикл работает мгновенное а мне нужно что с небольшим интервалом


вот этот код работает как надо НО мне нужно в цикл вставить PolledWait, чтобы он мгновенно не срабатывал, а если я ставлю PolledWait, то по каким то причинам цикл срабатывает 1 раз
» раскрыть
Код:
scope Test initializer Init

globals
integer i = 0
endglobals


struct Test
    real num = 0.
    timer t
    unit u

        static method begin takes nothing returns nothing
            local Test data = Test(GetTimerData(GetExpiredTimer()))
            set data.num = data.num + 1
            call BJDebugMsg(R2S(data.num))
            if data.num >= 5 then
                call data.destroy()
            endif    
        endmethod
        
        static method start takes location s returns Test
            local Test data = Test.allocate()
            set data.t = NewTimer()
            set data.u = CreateUnit(GetTriggerPlayer(),'h002',GetLocationX(s),GetLocationY(s),bj_RADTODEG  )
            
            call SetTimerData(data.t,data)
            
            call TimerStart(data.t,.5,true,function Test.begin)
            return data
        endmethod
        
        
        method onDestroy takes nothing returns nothing
            call ReleaseTimer(.t)
        endmethod
endstruct

function Con1 takes nothing returns nothing
    local Test t
    local integer y = 0
   local location l = GetSpellTargetLoc()
    loop 
    exitwhen y >= 3
    set t = Test.start(l)
    //call PolledWait(0.5)
    set y = y + 1
    endloop

    call t.destroy()

endfunction



function Con takes nothing returns boolean
    local timer t = NewTimer()
        if  GetSpellAbilityId() == 'A000'  then
            call Con1()
        endif
        return false
endfunction


function Init takes nothing returns nothing
    local trigger Testt = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( Testt, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( Testt, Condition( function Con ) )
endfunction

endscope

Отредактировано LostCoast, 18.09.2011 в 22:02.
Старый 18.09.2011, 21:50
Doc

offline
Опыт: 63,163
Активность:
LostCoast, а я о чем? это другой поток, там не будут ваши переменные работать.
Старый 18.09.2011, 22:04
LostCoast

offline
Опыт: 2,633
Активность:
Doc, но я не понимаю почему циклом все работает(((
Старый 18.09.2011, 22:06
Doc

offline
Опыт: 63,163
Активность:
Потому-что цикл не запускает новый поток, ага?
Старый 18.09.2011, 22:19
LostCoast

offline
Опыт: 2,633
Активность:
понял, почему поставив в цикле PolledWait все последующие действия не работают?
Старый 18.09.2011, 22:30
Doc

offline
Опыт: 63,163
Активность:
После вэйта сбрасываются всякие GetSpellTargetUnit/Loc/X/Y и не только они. Но остается GetTriggerUnit.
Старый 18.09.2011, 22:38
LostCoast

offline
Опыт: 2,633
Активность:
можешь дать тогда совет что мне делать??цикл это мой самый крайний вариант хотелось бы использовать таймер, если я правильно понял то можно создать доп. структуру в которую сохранить юнита и точку каста и перенести их в функцию запущенную таймером, ток это пока у меня не получается...
Старый 18.09.2011, 22:45
Doc

offline
Опыт: 63,163
Активность:
отлично, шерлок!
дерзайте еще.
Старый 18.09.2011, 22:47
LostCoast

offline
Опыт: 2,633
Активность:
спасибо, все работает как надо.
Старый 18.09.2011, 23:37
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 13:36.