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

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

Ответ
 
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Заклинание бомбардировка - требуется помощ в оптимизации
Вот код главной функции, которая запускается другим тригером:

Код:
function Trig_Cast3_Func003Func003A takes nothing returns nothing
    local trigger t = GetTriggeringTrigger()
    local location array loc
    local integer i = 1
    local integer l
    local integer lvl = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId())
//Заносим в точки нужные координаты из предыдущей функции
    loop
    exitwhen i > lvl * 4
        set loc[i] = get_object_lparam(t,"loc"+I2S(i))
        set i = i + 1 
    endloop
//Заставляем всех юнитов стрелять и двигаться в соседнию точку
    set i = get_object_iparam(t,"sch")
//В i находится число из предыдущей функции для того, чтобы юнит  
//в последней точке двигался в первую, а не следующую - не существующую
       if (GetUnitUserData(GetEnumUnit()) + i)<= lvl then
            call IssuePointOrderLocBJ( GetEnumUnit(), "attackground", GetUnitLoc(GetEnumUnit()) )
            call PolledWait( 1.00 )
            call IssuePointOrderLocBJ( GetEnumUnit(),"move", loc[(GetUnitUserData(GetEnumUnit()) + i)] )
        else
            call IssuePointOrderLocBJ( GetEnumUnit(), "attackground", GetUnitLoc(GetEnumUnit()) )
            call PolledWait( 1.00 )
            call IssuePointOrderLocBJ( GetEnumUnit(),"move", loc[(-lvl * 4 + GetUnitUserData(GetEnumUnit()) + i)])
        endif
endfunction

function Trig_Cast3_Actions takes nothing returns nothing
    local trigger t = GetTriggeringTrigger()
    local unit array u
    local location array loc
    local integer lvl = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId())
    local integer i = 1
    local real l = 1.00
//Создаём n точек для вызываемых юнитов и сохраняем номера ячеек 
//памяти локальных переменых loc[i] для данного тригера t под именем loc+i 
//(где i номера от 1 до k)
    if lvl == 1 then 
        else 
        if lvl == 2 then
            set l = 1.50
        else 
            set l = 3.00
        endif
    endif
    loop
        exitwhen i > lvl * 4
        set loc[i] = PolarProjectionBJ(GetSpellTargetLoc(), ( l * 150.00 ), (l * I2R(( 30 * i ))))
            call set_object_iparam(t,"loc"+I2S(i),H2I(loc[i]))
        set i = i + 1
    endloop
        set i = 1
//В зависимости от уровня способности (1 - 3) будет создано 
//4 юнита , 8 или 12 юнитов (точки с номерами 1 - lvl*4) в недавно созданных точках.
//Для каждого юнита в кэш сохраняется число = индексу точки в которой он стоит.
    loop
        exitwhen i > lvl * 4
            call CreateNUnitsAtLoc( 1, 'h000', Player(0), loc[i], bj_UNIT_FACING )
            set u[i] = GetLastCreatedUnit()
            call SetUnitUserData(u[i],i)
        set i = i + 1
    endloop
    set i = 1
//Заставляем каждого юнита двигаться в соседнию точку (по часовой стрелке) и бомбить землю
    loop
        exitwhen i > lvl * 4
        call set_object_iparam(t,"sch",i)
            call ForGroupBJ( GetUnitsOfPlayerAndTypeId(Player(0), 'h000'), function Trig_Cast3_Func003Func003A )
            call PolledWait( 3.00 )
        set i = i + 1
    endloop
        set i = 1
    loop
        exitwhen i > lvl * 4
            call ExplodeUnitBJ( u[i] )
        set i = i + 1
    endloop
            call flush_object(t)
endfunction

//===========================================================================
function InitTrig_Cast3 takes nothing returns nothing
    local trigger t
    set t = CreateTrigger(  )
//    call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_SPELL_CAST )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CHANNEL )
    call TriggerAddAction( t, function Trig_Cast3_Actions )
endfunction


Заклинание работает так: вызывается (n*уровень абилки) юнитов, юниты должны двигаться по кругу и бомбить землю, после взорваться.

Проблема в том, что 4 юнита появляются не по квадрату (а в форме дуги) 12 юнитов появляются почему-то в 4-ёх точках, а должны в 12-ти и юниты почему-то не двигаются, при сохранении карты в редакторе ошибок не выдаётся...сам найти проблему не могу
На всякий случай вот вся карта http://dump.ru/files/o/o717748636/
Старый 13.03.2008, 23:08
J
expert
offline
Опыт: 48,447
Активность:
Trig_Cast3_Func003Func003A в этой функции нельзя использовать слипы
использование кеша ужасное, он вообще не должен сдесть использоватся, все можно сделать на локалках и пару глобалок

Jon добавил:
естествено оптимизация сдесь страдает, но она здесь не нужна, т.к. в первую очередь нужно переделать сам алгоритм, т.к. иначе всеравно работать как надо не будет...
Старый 13.03.2008, 23:33
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
На локальках - глобалки пытался, но получалось что самолёты иногда не туда летели, а как лучше алгоритм построить? Я вообще с группами работать не умею... :(:
Старый 14.03.2008, 00:35
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Если кто в силах, подскажите как алгоритм заклинания построить...
Заклинание которое будет работать так:
В зависимости от уровня заклинаня будет появляться 4 8 или 12 самолётов (со способностью маскиты) эти самолёты будут летать по кругу (по часовой стрелке) и бомбить землю N-ое количество раз, после чего взорвутся
Старый 14.03.2008, 13:44
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Я пошёл по пути наименьшего сопративления и сделал спел так - у меня теперь все юниты всегда двигаются в точку (текущая точка + число цикла), а так же есть переменная которая создаёт для каждого каста индексы отличающиеся на 24. Но у меня не передаётся через кэш почему-то число, млин почему?

Код:
function Trig_Cast_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A001' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Cast_Func003Func001A takes nothing returns nothing
    call IssuePointOrderLocBJ( GetEnumUnit(), "attackground", GetUnitLoc(GetEnumUnit()) )
endfunction

function Trig_Cast_Func003Func003A takes nothing returns nothing
    local trigger t = GetTriggeringTrigger()
    local integer i = GetStoredInteger(udg_cache,I2S(H2I(t)),"i")
    call IssuePointOrderLocBJ( GetEnumUnit(), "move", udg_AirStrikePoints[( GetUnitUserData(GetEnumUnit()) + i )] )
endfunction

function Trig_Cast_Actions takes nothing returns nothing
    local trigger t
    local integer k
    local integer sch = udg_sch
    local integer i = sch + 1
    local integer angle
    local integer lvl = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId())
    local unit array u
    set udg_sch = udg_sch + 24 
    set k = sch + 24
    if lvl == 1 then
    set angle = 90
        else 
        if lvl == 2 then
        set angle = 45
            else
            set angle = 30
        endif
    endif
//    call CreateTextTagUnitBJ( I2S(udg_sch), gg_unit_N000_0000, 0, 10, 100, 100, 100, 0 )
    loop
        exitwhen i > k
        set udg_AirStrikePoints[i] = PolarProjectionBJ(GetSpellTargetLoc(), ( I2R(lvl) * 150.00 ), I2R(( angle * i )))
        set i = i + 1
    endloop
    set i = sch + 1
    set k = lvl * 4 + sch 
    loop
        exitwhen i > k
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), udg_AirStrikePoints[i], bj_UNIT_FACING )
        set u[i] = GetLastCreatedUnit()
        call SetUnitUserData(u[i],i)
        set i = i + 1
    endloop
    set i = sch + 1
    set k = sch + 12
    loop
        exitwhen i > k
        call StoreInteger(udg_cache,I2S(H2I(t)),"i",i)
        call CreateTextTagUnitBJ( I2S(i), gg_unit_N000_0000, 0, 10, 100, 100, 100, 0 )
        call ForGroupBJ( GetUnitsOfPlayerAndTypeId(Player(0), 'h000'), function Trig_Cast_Func003Func001A )
        call TriggerSleepAction( 0.70 )
        call ForGroupBJ( GetUnitsOfPlayerAndTypeId(Player(0), 'h000'), function Trig_Cast_Func003Func003A )
        call TriggerSleepAction( 0.30 )
        set i = i + 1
    endloop
    set i = (sch + 1)
    set k = ( lvl * 4 + sch )
    loop
        exitwhen i > k
        call ExplodeUnitBJ( u[i] )
        set i = i + 1
    endloop
endfunction

//===========================================================================
function InitTrig_Cast takes nothing returns nothing
    local trigger t
    set t = CreateTrigger(  )
    call TriggerRegisterUnitEvent( t, gg_unit_N000_0000, EVENT_UNIT_SPELL_CAST )
    call TriggerAddCondition( t, Condition( function Trig_Cast_Conditions ) )
    call TriggerAddAction( t, function Trig_Cast_Actions )
endfunction
Старый 17.03.2008, 20:52
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Тему можно закрывать я оптимизировал карту вот ссылка http://dump.ru/files/o/o165693603/ - всё сделал просто и элементарно, разьве что только можно ещё изменить вычисление точек юнитов - заменить polarProjection на MoveLocation, но это уже сами, по желанию...
Прикрепленные файлы
Тип файла: w3x test.w3x (20.9 Кбайт, 13 просмотров )

Отредактировано happy_horror, 20.04.2008 в 07:26.
Старый 21.03.2008, 00:19
Ответ

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

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

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

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



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