Хочу научиться джазу, читаю уроки, но возник вопрос:
Не получается вызвать функцию, вызывающую триггер с переменной типа location
вот код:
function Firelocini takes location poz returns nothing
    call TriggerExecute( gg_trg_Fireloc )
endfunction


function Trig_By_the_fire_way_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A003' ) ) then
        return false
    endif
    return true
endfunction


function Trig_By_the_fire_way_Actions takes nothing returns nothing
    local unit u
    local real ang
    local location poz
    local integer i = 0
    local effect array s
    set u = GetSpellTargetUnit()
    set ang = AngleBetweenPoints ( GetUnitLoc(udg_Fireman), GetUnitLoc(u))
    set poz = GetUnitLoc(udg_Fireman)
    call MoveLocation(poz, GetLocationX(poz) + 50 * CosBJ(ang), GetLocationY(poz) + 50 * SinBJ(ang))
loop
 exitwhen i>12      
    set i=i+1
    call MoveLocation(poz, GetLocationX(poz) + 50 * CosBJ(ang), GetLocationY(poz) + 50 * SinBJ(ang))
    call Firelocini (location poz)
endloop 

    call PolledWait( 0.3 )
    
set i=0
loop
 exitwhen i>12
set i=i+1
    call DestroyEffectBJ( s[i] )
set s[i]=null
endloop

    set u=null
    set ang=0
    set i=0
    set poz=null
       
endfunction


//===========================================================================
function InitTrig_By_the_fire_way takes nothing returns nothing
    set gg_trg_By_the_fire_way = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_By_the_fire_way, gg_unit_O002_0009, EVENT_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_By_the_fire_way, Condition( function Trig_By_the_fire_way_Conditions ) )
    call TriggerAddAction( gg_trg_By_the_fire_way, function Trig_By_the_fire_way_Actions )
endfunction
А вот триггер который я хочу вызвать
  function Trig_Fireloc_Actions takes location poz returns nothing
  
  call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
  
  endfunction

//===========================================================================
function InitTrig_Fireloc takes nothing returns nothing
    set gg_trg_Fireloc = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Fireloc, function Trig_Fireloc_Actions )
endfunction
Мне выдает ошибку на этом моменте
call TriggerExecute( gg_trg_Fireloc )
и на этом
call Firelocini (location poz)
А как мне вызвать функцию с этой переменной тогда? я не понимаю

Принятый ответ

А в чем проблема очистки точки командой
Очистка утечки - не проблема, но:
  • зачем создавать утечку и удалять её, если можно просто не создавать? ))
  • действия с координатами работают быстрее точек
  • нет лишних действий с перемещением точек
Допустим, есть два юнита - u1 и u2. Их координаты:
local real x1 = GetUnitX(u1)
local real y1 = GetUnitY(u1)
local real x2 = GetUnitX(u2)
local real y2 = GetUnitY(u2)
Угол a между ними:
local real a = Atan2(y2-y1, x2-x1)
Точка с координатами (x3;y3), расположенная под углом a на расстоянии 50 от юнита с координатами (x2;y2):
local real x3 = x2+50*Cos(a)
local real y3 = y2+50*Sin(a)
Чтобы создать эффект по координатам:
call AddSpecialEffect("Путь к модели", x3, y3)
Все переменные - локальные.
Необходимо удалить эффект после использования. Или использовать юнитов с ограниченным временем жизни, как пишет prog. В этом случае память очистится после смерти юнита автоматически.
Локальные реальныецелочисленные) переменные не требуют обнуления.
Нет необходимости создавать новый триггер, всё умещается в одном.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
24
6 лет назад
0
VVelikolepniy, просто сформулируй ответы на эти вопросы - я не смогу помочь не разобравшись в том, что именно ты пропустил из основ. А попытки получить доступ к локальной переменной - явно говорят о том что что-то пропущено.
0
8
6 лет назад
Отредактирован VVelikolepniy
0
prog:
VVelikolepniy, просто сформулируй ответы на эти вопросы - я не смогу помочь не разобравшись в том, что именно ты пропустил из основ. А попытки получить доступ к локальной переменной - явно говорят о том что что-то пропущено.
Переменная - занимаемая ячейка памяти с записанными значениями
Глобальная переменная используется в любом количестве триггеров
Локальная - для конкретного триггера
триггер - реакция на событие
функция - алгоритм берущий один результат и выдающий другой
0
24
6 лет назад
0
VVelikolepniy,
глобальная переменная - доступна в любом месте
локальная - доступна только в той ФУНКЦИИ в которой объявлена
функция - в рамках jass это самодостаточный фрагмент кода, могущий принимать параметры, содержать локальные переменные и возвращать значение
триггер - конструкция, которая при срабатывании события проверяет условия и вызывает действие если условие выполнено, условия и действия триггера выполнены в виде функций
0
8
6 лет назад
0
prog:
VVelikolepniy,
глобальная переменная - доступна в любом месте
локальная - доступна только в той ФУНКЦИИ в которой объявлена
функция - в рамках jass это самодостаточный фрагмент кода, могущий принимать параметры, содержать локальные переменные и возвращать значение
триггер - конструкция, которая при срабатывании события проверяет условия и вызывает действие если условие выполнено, условия и действия триггера выполнены в виде функций
Я понимаю, то есть мне не получится добавить локальную переменную в триггер из другого триггера, тк локальная переменная типа не может передаваться... Но как мне обойти тогда это? У меня есть мысль что надо вынуть из локальной переменной значение координаты и вписать ее в аргумент функции
3
24
6 лет назад
3
Триггеры рассчитаны на вызов при срабатывании событий и, соответственно, не принимают параметров, поскольку события не передают параметров.
Кроме того, значение локальной переменной, как и параметров, хранится только в пределах текущего вызова функции - даже если поставить мемхак и вызывать триггер с параметром, триггер никаким магическим образом не запомнит значение параметра для следующих вызовов.
Я бы на твоем месте начал с более простого спела - реализовал бы огоньки юнитами со способностью 'Aloc' (тогда их нельзя будет выделить и атаковать) и с пассивным адским пламенем или пламенем феникса, без дополнительного урона от длительности горения, но зато и без необходимости самостоятельно реализовывать поиск целей и нанесение урона.
Ну и да, локальные переменные типа точки мало обнулять, их перед этим нужно еще удалять соответствующей функцией.
3
18
6 лет назад
3
А в чем проблема очистки точки командой
Очистка утечки - не проблема, но:
  • зачем создавать утечку и удалять её, если можно просто не создавать? ))
  • действия с координатами работают быстрее точек
  • нет лишних действий с перемещением точек
Допустим, есть два юнита - u1 и u2. Их координаты:
local real x1 = GetUnitX(u1)
local real y1 = GetUnitY(u1)
local real x2 = GetUnitX(u2)
local real y2 = GetUnitY(u2)
Угол a между ними:
local real a = Atan2(y2-y1, x2-x1)
Точка с координатами (x3;y3), расположенная под углом a на расстоянии 50 от юнита с координатами (x2;y2):
local real x3 = x2+50*Cos(a)
local real y3 = y2+50*Sin(a)
Чтобы создать эффект по координатам:
call AddSpecialEffect("Путь к модели", x3, y3)
Все переменные - локальные.
Необходимо удалить эффект после использования. Или использовать юнитов с ограниченным временем жизни, как пишет prog. В этом случае память очистится после смерти юнита автоматически.
Локальные реальныецелочисленные) переменные не требуют обнуления.
Нет необходимости создавать новый триггер, всё умещается в одном.
Принятый ответ
0
28
6 лет назад
0
Локальные реальные (и целочисленные) переменные не требуют обнуления.
Требуют обнуления только те переменные, у которых тип наследуются от handle.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.