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

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

Ответ
 
BesitzeRuf

offline
Опыт: 560
Активность:
Таймеры и теория о них, помогите, кто сечет в них)
Всем привет, скажите как сделать так, чтобы я мог кастовать один и тот же спелл несколько раз, и чтобы все потом созданные юниты перемещались.Вот мой код (на БЖ пока не смотрите, не трогал их еще)
function Shock_Star_Dummy takes nothing returns nothing


        local timer t= GetExpiredTimer() //Получаем таймер, вызвавший данную ф-цию
        local real angle= LoadReal(udg_Hash, GetHandleId(t), 4)
        local location u_loc = LoadLocationHandle(udg_Hash,GetHandleId(t), 2)
        local location t_loc = LoadLocationHandle(udg_Hash,GetHandleId(t), 3)
        local unit dummy=LoadUnitHandle(udg_Hash, GetHandleId(t),1) //Загружаем нужного нам юнита
        // Move Dumyy ///////////////////////////////////////////////////////
        local real x = GetLocationX(GetUnitLoc(dummy)) + 10 * Cos(angle * bj_DEGTORAD)
        local real y = GetLocationY(GetUnitLoc(dummy)) + 10 * Sin(angle * bj_DEGTORAD)
        call SetUnitPositionLoc( dummy, Location(x, y), 10.00, udg_angle)     
            
        //call FlushChildHashtable(udg_Hash, GetHandleId(t)) //Удаляем записи таймера
endfunction     

function Trig_Shock_Star_Actions takes nothing returns nothing
        local real angle= AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetSpellTargetLoc())
        local location u_loc = PolarProjectionBJ(GetUnitLoc(GetTriggerUnit()), 70.00, angle)
        local location t_loc = PolarProjectionBJ(u_loc, 1000.00, angle)
        local timer t= CreateTimer()
        local hashtable hash = InitHashtable()
        call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(GetTriggerUnit()), u_loc, angle )
        local unit dummy = GetLastCreatedUnit()
        set udg_Hash = InitHashtable()
        set hash=udg_Hash
        call SaveUnitHandle(hash, GetHandleId(t), 1, dummy) //Сохраняем ссылку на юнита “внутри” таймера
        call SaveLocationHandle(hash,GetHandleId(t), 2, u_loc)
        call SaveLocationHandle(hash,GetHandleId(t), 3, t_loc)
        call SaveReal(hash, GetHandleId(t), 4, angle)
        set udg_Hash = hash
        call TimerStart( t, 0.01,true, function Shock_Star_Dummy)
endfunction
Вот как должно работать (главное чтобы все в одном триге было). И такЖ юнит кастует спелл. перед ним создается юнит, потом этого юнита я перемещаю каждые 0,01 сек на 10 по определенному углу ... все вроде как нормально, но как только я его еще раз кастану, полетит второй юнит а первый остановиться... ((( ПОМОГИТЕ плиз..

Отредактировано ScorpioT1001, 13.05.2010 в 13:21.
Старый 12.05.2010, 23:56
Nekit1234007

offline
Опыт: 11,916
Активность:
Правильно, при первом цикле таймера таблица очищается =\
Nekit1234007 добавил:
Код ужасен офк.
Старый 12.05.2010, 23:58
BesitzeRuf

offline
Опыт: 560
Активность:
да нет же, она серым цветом (это комент)
BesitzeRuf добавил:
перемещение работает (я доделал.. тепреь и урон наносит и т.д.) но вопрос в другом!!! почему кастанув второй раз (пока летит первый шарик) полетит второй а первый остановится ??? переменные же локальные...
BesitzeRuf добавил:
Все тему можно офф, проблема была в udg_Hash функции InitHashTaable() .... я ее перенес в тригер инициализации мапы. все работает так как надо ( теперь со спокойной душой можно приводить код в порядок ))) Я просто не знал, но догадывался, что эта функция как-то обновляеи ХТ??? или я не прав?
Старый 13.05.2010, 01:28
_Red

offline
Опыт: 4,095
Активность:
Зачем локальная хэш таблица? Одной на всю карту хватит ( хоть подавись )
Рекомендую к прочтению ( или перепрочтению )
Старый 13.05.2010, 04:12
Nekit1234007

offline
Опыт: 11,916
Активность:
При дальнейшем рассмотрении кода, упал.
local hashtable hash = InitHashtable()
set udg_Hash = InitHashtable()
set hash=udg_Hash
Што это такое?! Вот из-за этого говнокода и идёт всё ясно куда. Ещё создаёшь кучи локальных одноразовых точек, их не удаляешь и не обнуляешь О_О
Старый 13.05.2010, 07:54
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
BesitzeRuf:
all SetUnitPositionLoc( dummy, Location(x, y), 10.00, udg_angle)
здесь глобалка а должна быть локалка по идеи
Старый 13.05.2010, 08:00
BesitzeRuf

offline
Опыт: 560
Активность:
ей ей ей... знаюююю ))) но что ты хочешь, я в джассе начал недавно программировать....Еще нет своего стиля написания кода.... а с переменными, ну почему нельзя понять, что когда что-то не работает, то надо что-то делать... а когда не знаешь почему, делать приходится все. Даже такие глупые вещи ))). И еще, [b]_Red[/b], Одной таблицы на всю игру хватит??? То есть не зачем мне создавать еще пару глобальных ХТ (не знаю, просто есть ли вероятность того, что ИД хендла совпадут.... а точнее, если ХТ может быть полностью заполенна? Хотя сам понимаю, что при количестве в 12 игроков, будет сложно ее заполнить, применяя спелы )))
Старый 13.05.2010, 08:49
Arty3ooo
...
offline
Опыт: 3,125
Активность:
Уже не смешно ребята... юзайте include brains.txt Про хеш убило...
и.. если GetHandleId(t) используется больше одного раза, логично занести его в локалку..

Цитата:
call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(GetTriggerUnit()), u_loc, angle )
local unit dummy = GetLastCreatedUnit()


это как так.? объявление локалок должно происходить перед кодом... и ты утверждаешь что это работает?
unit dummy = CreateUnit(.............) Начинай любить XY
Старый 13.05.2010, 09:27
BesitzeRuf

offline
Опыт: 560
Активность:
Так, то что вверху работает, так как это БЖ )) и я же написал в конце, не смотрите вы на них, я код потом правлю...... выложил "мокрый код" ... А что заносить в локалку ХЕШ???
Старый 13.05.2010, 10:29
agentex

offline
Опыт: 34,834
Активность:
хеш должен храниться в глобалке, в локальном хеше нет никакого смысла :)
Старый 13.05.2010, 11:11
BesitzeRuf

offline
Опыт: 560
Активность:
Вот доработанный код....
function Trig_Shock_Star_Conditions takes nothing returns boolean
    return ( GetSpellAbilityId() == 'A000' )
endfunction

function Trig_Shock_Star_Dummy_Filter2 takes nothing returns boolean
    return (( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false )) and ((GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) >= 0)) and ((IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_Star_Dummy)) == true ))
endfunction



function Shock_Star_Dummy takes nothing returns nothing

    // Загружаем данные из ХТ .....
    local timer     t= GetExpiredTimer() //Получаем таймер, вызвавший данную ф-цию
    local real      angle= LoadReal(udg_Hash, GetHandleId(t), 4)
    local location  u_loc = LoadLocationHandle(udg_Hash,GetHandleId(t), 2)
    local location  t_loc = LoadLocationHandle(udg_Hash,GetHandleId(t), 3)
    local unit      dummy=LoadUnitHandle(udg_Hash, GetHandleId(t),1) //Загружаем нужного нам юнита
    // Move Dumyy ///////////////////////////////////////////////////////
    local real x = GetLocationX(GetUnitLoc(dummy)) + 10 * Cos(angle * bj_DEGTORAD)
    local real y = GetLocationY(GetUnitLoc(dummy)) + 10 * Sin(angle * bj_DEGTORAD)
    call SetUnitPositionLoc( dummy, Location(x, y), 10.00, angle) 
    
    set x = GetLocationX(GetUnitLoc(dummy)) - GetLocationX(u_loc)
    set y = GetLocationX(GetUnitLoc(dummy)) - GetLocationX(u_loc)
    if ( SquareRoot(x * x + y * y) >= 1500.00 ) then
        call FlushChildHashtable(udg_Hash, GetHandleId(t)) //Удаляем записи таймера
        call DestroyTimer(t)
        call RemoveUnit( dummy )
    else
    local group g = CreateGroup()
    // Проверяем врага рядом....
    set udg_Star_Dummy = dummy
    call GroupEnumUnitsInRangeOfLoc(g, GetUnitLoc(dummy), 80.00, Condition(function Trig_Shock_Star_Dummy_Filter2))
    set udg_Star_Dummy = null
    local unit target =FirstOfGroup(g)
    if ( target != null ) then
            call UnitDamageTarget(target, target , 50.00+(SquareRoot(x * x + y * y) / 5), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MIND, WEAPON_TYPE_WHOKNOWS)  
            call RemoveUnit( dummy )
            call FlushChildHashtable(udg_Hash, GetHandleId(t)) //Удаляем записи таймера
            call DestroyTimer(t) //Обнуляем переменные и “разрушаем” таймер 
        else
        endif
    endif    
    set t = null
    set u_loc = null
    set t_loc = null
    set g = null
    set dummy=null
    set target = null
    
endfunction 



function Trig_Shock_Star_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local real angle= bj_RADTODEG * Atan2(GetLocationY(GetSpellTargetLoc()) - GetLocationY(GetUnitLoc(u)), GetLocationX(GetSpellTargetLoc()) - GetLocationX(GetUnitLoc(u)))
 
    local real x = GetLocationX(GetUnitLoc(u)) + 70.00 * Cos(angle * bj_DEGTORAD)
    local real y = GetLocationY(GetUnitLoc(u)) + 70.00 * Sin(angle * bj_DEGTORAD)    
    local location u_loc = Location(x, y)
   
    set x = GetLocationX(u_loc) + 1200.00 * Cos(angle * bj_DEGTORAD)
    set y = GetLocationY(u_loc) + 1200.00 * Sin(angle * bj_DEGTORAD)    
    local location t_loc = Location(x, y)
    local unit dummy = CreateUnitAtLoc(GetOwningPlayer(u), 'e000' , u_loc , angle)
    // Создаем таймер
    local timer t= CreateTimer()
    call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, dummy) //Сохраняем ссылку на юнита “внутри” таймера
    call SaveLocationHandle(udg_Hash,GetHandleId(t), 2, u_loc)
    call SaveLocationHandle(udg_Hash,GetHandleId(t), 3, t_loc)
    call SaveReal(udg_Hash, GetHandleId(t), 4, angle)
    call TimerStart( t, 0.01,true, function Shock_Star_Dummy)
    // Обнуляем все ..........
    set u = null
    set u_loc = null
    set t_loc = null
    set t = null
    
    
endfunction

//===========================================================================
function InitTrig_Shock_Star takes nothing returns nothing
    local trigger Shock_Star = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( Shock_Star, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( Shock_Star, Condition( function Trig_Shock_Star_Conditions ) )
    call TriggerAddAction( Shock_Star, function Trig_Shock_Star_Actions )
    set Shock_Star = null
endfunction
Кстати, почему ББ коды не работают?

Отредактировано ScorpioT1001, 13.05.2010 в 13:21.
Старый 13.05.2010, 12:30
Nekit1234007

offline
Опыт: 11,916
Активность:
Потому что либо включай старый способ или используй новый
[+] замечание от ScorpioT1001: надеюсь, это опечатка :)

Отредактировано ScorpioT1001, 13.05.2010 в 13:18.
Старый 13.05.2010, 12:44
Doc

offline
Опыт: 63,163
Активность:
Если ты не используешь сж тогда локалки можно объявлять только вверху функции. Утечек все равно море.
Старый 13.05.2010, 14:36
St1mPi

offline
Опыт: 93
Активность:
Код:
call FlushChildHashtable(udg_Hash, GetHandleId(t)) //Удаляем записи таймера
endfunction

вот ответ на твой вопрос: "Почему юнит стоит"

Код:
local hashtable hash = InitHashtable()

убери все что с этим связано

Код:
call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(GetTriggerUnit()), u_loc, angle )
local unit dummy = GetLastCreatedUnit()

лучше так: local unit dummy = CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(GetTriggerUnit()), u_loc, angle )

Код:
set udg_Hash = InitHashtable()

Хеш инициализируй при запуске карты и работай только с глобальным хешем.
Старый 13.05.2010, 16:20
Nekit1234007

offline
Опыт: 11,916
Активность:
St1mPi:
лучше так: local unit dummy = CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(GetTriggerUnit()), u_loc, angle )
Ага, такой же фейл был у свдна, посмотри хотябы, что эта функция возвращает.
Старый 13.05.2010, 16:29
St1mPi

offline
Опыт: 93
Активность:
Nekit1234007,
я имел ввиду, что локалки обьявляются вначале кода
Старый 13.05.2010, 16:35
BesitzeRuf

offline
Опыт: 560
Активность:
Arty3ooo, я еще не такого уровня ))) И всеже, может написать, что надо исправить????
А St1mPi, какая разница где будут локалки? мне, что бы все не искать, проще все локалки, которым сразу значение можно присвоить отправить на верх...
Старый 13.05.2010, 17:17
St1mPi

offline
Опыт: 93
Активность:
BesitzeRuf, твой код работает??
Старый 13.05.2010, 17:29
BesitzeRuf

offline
Опыт: 560
Активность:
да, видео сделать?? причем теперь все правильно, то есть если все время не прерывно кастовать кастовать, то все и дамажит и летит и удаляется )) а почему ты думаешь, что он не должен работать?
Старый 13.05.2010, 18:20
_Red

offline
Опыт: 4,095
Активность:
BesitzeRuf, потому что St1mPi, не знает что в Cjass можно объявлять локальные переменные где угодно, и не только
Старый 13.05.2010, 18:58
Ответ

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

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

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

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



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