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

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

Ответ
 
BesitzeRuf

offline
Опыт: 560
Активность:
Таймеры , опять((
Вот мой как бы тригерр
» Сам триггер
function off_vrawat takes nothing returns nothing
local timer t2 = GetExpiredTimer()  // 5- секундный таймер
local timer t = LoadTimerHandle(udg_Hash, GetHandleId(t2),1 ) // переодический таймер ???

call DestroyTimer( t) 
set t2 = null
set t = null
endfunction



function vrawat takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(t),1)
local real angle = LoadReal(udg_Hash, GetHandleId(t), 2)

set angle = angle + 50.  //Увеличиваю угол поворота юнита


call PauseUnit(u,true)    // говорят, чтобы заработала ффункция сетюнитфейсинг надо паузнуть юнита
call SetUnitFacing(u, angle )  // как бы меняю юниту угол поворота
call PauseUnit(u,false)  // как бы возвращаю ему нормальное состояние , но он не поворачивается

call SaveReal(udg_Hash, GetHandleId(t), 2, angle)

set t = null
set u = null
endfunction



function Trig_vrawenije_Actions takes nothing returns nothing
    if ( GetSpellAbilityId() == 'A001' ) then
    local unit u = GetTriggerUnit()
    local timer t = CreateTimer() // Создаю таймер
    local timer t2 = CreateTimer()// Создаю таймер
    local real angle = GetUnitFacing(u) //  узнаю угол поворота юнита...
    call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u) //Сохраняю данные для переодического таймера..
    call SaveReal(udg_Hash, GetHandleId(t), 2, angle) //тоже самое
    

    call TimerStart(t , 0.5, true, function vrawat) ///  запускаю таймер
    call SaveTimerHandle(udg_Hash, GetHandleId(t2), 1,t)
    
    call TimerStart(t2 , 5. , false, function off_vrawat)  // этот таймер для остановки предыдущего таймера ....
    endif
endfunction

//===========================================================================
function InitTrig_vrawenije takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( t, function Trig_vrawenije_Actions )
    
    set t = null
endfunction
первый и второй таймеры запускаются.. в периодический таймер в хеш данные записываются, а вот в 5-секундный таймер нет... почему-то там не сохраняется ссылка на периодический таймер.. Прошупомочь разобраться как все должно работать??
П.С. Не ругайте за вид кода, всегда так делаю, потом когда спел заработает, начинаю его оптимизировать..
П.С.2. Описание скила, Герой нажимает на кнопку.. скил действует 5 сек (он как бы канальный... ).. во время действия юнит просто вращается.. (ну это пока, и то не работает)
Прошу еще раз помочь с этим(( Много чего перепробовал...

Отредактировано BesitzeRuf, 15.06.2011 в 13:44.
Старый 15.06.2011, 13:39
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
BesitzeRuf:
call PauseUnit(u,true) говорят, чтобы заработала ффункция сетюнитфейсинг надо паузнуть юнита
o_O впервые слышу
Srezik добавил:
кстати, ты не очищаешь ячейки ...
Srezik добавил:
BesitzeRuf:
t2 , 5. , false, function off_vrawat
что за точка, после пятёрки?
Srezik добавил:
FlushChildHashtable юзай, но это так, оффтопик
Старый 15.06.2011, 18:35
BesitzeRuf

offline
Опыт: 560
Активность:
ты читать умеешь? я спрашиваю почему не работает а не почему он не оптимизирован(...
Старый 15.06.2011, 18:47
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Цитата:
Сообщение от Srezik
что за точка, после пятёрки?

что бы меньше обрабывать вару
Цитата:
Сообщение от BesitzeRuf
if ( GetSpellAbilityId() == 'A001' ) then
local unit u = GetTriggerUnit()

локалы должны быть в начеле ф-ии,если ты не пиши на сJass,но им тут не пахнет
Я думаю что лучше в ф-ии vrawat сделать так:
Код:
function vrawat takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(t),1)
local real angle = LoadReal(udg_Hash, GetHandleId(t), 2)
local integer time=LoadInteger(udg_Hash,GetHandleId(t),3)-.5
set angle = angle + 50. 
call PauseUnit(u,true)    
call SetUnitFacing(u, angle )  
call PauseUnit(u,false) 
if time>.0 then
call SaveReal(udg_Hash, GetHandleId(t), 2, angle)
call SaveInteger(udg_Hash,GetHandleId(t),3,time
else
call PauseTimer(t)//Переодический таймер сначала нужна запаузить а уж потом...
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
set t = null
set u = null
endfunction

а в ф-ии Trig_vrawenije_Actions

Код:
call SaveReal(udg_Hash, GetHandleId(t), 3, 5)
Старый 15.06.2011, 18:54
krosaf4eg

offline
Опыт: 1,859
Активность:
» набросал на скорую руку
scope turn initializer turninit
{
    include "cj_types_priv.j"
    define 
    {
        private turn_id = 'A000'
        private ht_unit = 0
        private ht_count = 1
    }
    
    private hashtable ht = InitHashtable()
    
    private void turnperiodic()
    {
        timer t = GetExpiredTimer()
        int htkey = GetHandleId(t)
        unit u = LoadUnitHandle(ht, htkey, ht_unit)
        int count = LoadInteger(ht, htkey, ht_count)
        SetUnitFacing(u, GetUnitFacing(u)+50.)
        if ++count == 10
        {
            DestroyTimer(t)
            FlushChildHashtable(ht, htkey)
        }
        else
        {
            SaveInteger(ht, htkey, 1, count)
        }
        t = null
        u = null
    }
    
    private void turnactions()
    {
        timer t = CreateTimer()
        int htkey = GetHandleId(t)
        SaveUnitHandle(ht, htkey, ht_unit, GetTriggerUnit())
        SaveInteger(ht, htkey, ht_count, 0)
        TimerStart(t, .5, true, function turnperiodic)
        t = null
    }
    
    private bool turncond()
    {
        if GetSpellAbilityId() == turn_id
        {
            turnactions()
        }
        return false
    }
    
    private void turninit()
    {
        trigger t = CreateTrigger()
        TriggerAddCondition(t, Condition(function turncond))
        TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        t = null
    }
}
Старый 15.06.2011, 19:00
BesitzeRuf

offline
Опыт: 560
Активность:
локалы должны быть в начеле ф-ии,если ты не пиши на сJass,но им тут не пахнет
пишу пока никак.. нет своего стиля еще... но всякие джассы есть) поэтому все смешано.. но юнитфайсинг сама по себе функция не рабочая...
BesitzeRuf добавил:
Меня вот эта строка еще просто убила
local integer time=LoadInteger(udg_Hash,GetHandleId(t),3)-.5
Старый 15.06.2011, 19:37
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
BesitzeRuf, что тебе не нравится?
Старый 15.06.2011, 19:39
BesitzeRuf

offline
Опыт: 560
Активность:
У меня еще есть триггер
function Trig_Init_Actions takes nothing returns nothing
    call TriggerSleepAction(0.5)
    set udg_Hash = InitHashtable()
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerAddAction( t,  function Trig_Init_Actions )
endfunction
Который собственно и инициализирует таблицу.. поэтому там во вращении я просто выяснил.. что в функции off_vrawenije ид как-бы сохраненного хендла таймера равен 0 .. Тоесть не работает функция
 call SaveTimerHandle(udg_Hash, GetHandleId(t2), 1,t)
как я понял....
BesitzeRuf добавил:
Dreii:
BesitzeRuf, что тебе не нравится?
ну посмотри на тип который ты присуждаешь переменной ( целочисленному даешь реальную.. наоборот можно вроде а вот так ни как..)
BesitzeRuf добавил:
Dreii
И все же... как я понял.. ты там используешь один таймер (чтобы такого не возникло как у меня с 2.. ) но создаешь переменную типа время.... и просто отслеживаешь .. ? тоже можно... но блин.. это все надо высчитывать...
Старый 15.06.2011, 19:46
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
BesitzeRuf, че высчитывать то?Таймер запускается каждые ,5 секунд. Ты ждеш 5 секунд тость таймер запустится 10 раз. Можно 5-,5 либо 10-1
Старый 15.06.2011, 20:12
BesitzeRuf

offline
Опыт: 560
Активность:
Dreii:
BesitzeRuf, че высчитывать то?Таймер запускается каждые ,5 секунд. Ты ждеш 5 секунд тость таймер запустится 10 раз. Можно 5-,5 либо 10-1
...
Просто всегда лучше доводить код так, чтобы меньше в нем таких вот значений было, которых потом может развестись море.. и вдруг нужно будет что-то изменить?? то есть я пытаюсь более глобально смотреть... все таки еще и уровни есть )
BesitzeRuf добавил:
Вот такой код уже заработал... Но унит не так быстро вращается как надо... Не знаете как обойти этот варовский глюк?
>>Рабочий код


nothing Vrawenije_vrawat() {
    timer t = GetExpiredTimer()
    unit u = LoadUnitHandle(udg_Hash, GetHandleId(t) , 1)
    real time = LoadReal(udg_Hash, GetHandleId(t) , 2)

    if (time >0.0 ) {
    
    
    SetUnitFacing( u ,GetUnitFacing(u)+ 30. )
    SaveReal(udg_Hash, GetHandleId(t),2,time - 0.04)
    } else {
    
    PauseUnit(u,false)
    PauseTimer(t)
    DestroyTimer(t)    
    FlushChildHashtable(udg_Hash,GetHandleId(t))
    }
    
    set t = null
    set u = null
}


nothing Trig_Vrawenije_Actions() {
if ( GetSpellAbilityId() == 'A001' ) {
    
    unit u = GetTriggerUnit()
    timer t = CreateTimer()
    PauseUnit(u,true) 
    SaveUnitHandle(udg_Hash, GetHandleId(t),1,u)
    SaveReal(udg_Hash, GetHandleId(t),2,5.0)
    TimerStart(t, 0.04, true, function Vrawenije_vrawat)
    
    set t = null
    set u = null
}
}

//===========================================================================
nothing InitTrig_vrawenije() {

    trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( t, function Trig_Vrawenije_Actions )
    set t = null
    
}
Старый 15.06.2011, 21:19
prog

offline
Опыт: 32,865
Активность:
максимальная скорость вращения юнита задается в РО
Старый 15.06.2011, 23:44
BesitzeRuf

offline
Опыт: 560
Активность:
так там и стоит 5!! ( максимальная 3, я через шифт ставил... )
Старый 15.06.2011, 23:59
Ответ

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

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

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

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



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