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

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

Ответ
 
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Цикл на локальных переменных возможен?
Обычно в циклах используются integer A или В, а так же глобальные переменные типа integer...а вот возможен ли цикл с использованием локальных переменных? Если возможен, то хотелось бы знать, как делается это правильно
P.S. "Осваиваем jass" читал, поиск юзал - ответа не нашёл...
Старый 04.03.2008, 13:09
S

offline
Опыт: 43,833
Активность:
Пример -
Код:
function alldefeat takes nothing returns nothing
local integer i=0
loop
exitwhen i==12
call CustomDefeatBJ(Player(i),"Disconnecting")
set i=i+1
endloop
endfunction


При вызове этой функции всем игрокам будет обьявлено поражение, и выведена менюшка с фразой "Disconnecting" (без кавычек)
Старый 04.03.2008, 13:12
denonlink

offline
Опыт: 1,112
Активность:
Можно
Код:
local integer int = 1
loop
  <действия цикла - юзаешь int где надо>
  set int = int + 1
  exitwhen int == 100
endloop

естественно начальное (1) и конечное(100) значения выбираешь какие тебе нужны
Старый 04.03.2008, 13:13
adic3x

offline
Опыт: 108,439
Активность:
ребят, цикл то вообще никак не влияет на область видимости...
и выход из цыкла идет по равенства выражения, следуещему за exitwhen true
Старый 05.03.2008, 10:53
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
ADOLF
Область видимости?
Чё-т ваще не вкурил, что ты сказал...
И Саша и демонлинк ведь вроде всё норм написали?...
Старый 05.03.2008, 11:07
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Область видимости

где можно, где нельзя обращаться в переменной/функции

область видимости локально переменной - функция, где она была обьявлена
глобальной - весь код

private члены в vJass ограничены конструктцией, в которой они обьявлены

в с++ в цикле фор область видимости переменной, обьявленно в цикле - этот цикл, поэтому и сакцентрировал, что в жасс цыклы не как не влияют на область видимости: for (int i=0x00 ; i==0x0f ; i++) - обращение к i вне тела цикла - ашипка)
Старый 05.03.2008, 11:29
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
А, ясно, что ты имел в виду.
Старый 05.03.2008, 11:37
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Вот конкретный вопрос, вот код:

Код:
function Trig_Cast_2_Func003Func003Func001001 takes nothing returns boolean
    return ( ( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() ) <= 12 )
endfunction

function Trig_Cast_2_Func003Func003A takes nothing returns nothing
    if ( Trig_Cast_2_Func003Func003Func001001() ) then
        call IssuePointOrderLocBJ( GetEnumUnit(), "move", udg_AirStrikePoints[( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() )] )
    else
        call IssuePointOrderLocBJ( GetEnumUnit(), "move", udg_AirStrikePoints[( -12 + ( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() ) )] )
    endif
endfunction

function Trig_Cast_2_Actions takes nothing returns nothing
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set udg_AirStrikePoints[GetForLoopIndexA()] = PolarProjectionBJ(GetSpellTargetLoc(), ( I2R(udg_AirStrikeLevel) * 150.00 ), I2R(( 30 * GetForLoopIndexA() )))
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    ...


Функции в тригере выполняются по порядку, не так ли? Я намерен изменить этот тригер (тригерная абилка) внести сюда локальные переменные, но что делать с функциями в которых есть GetForLoopIndexA? ведь это глобальные счётчики...я так же не могу понять, откуда в первых функциях задаётся значение Index A - ведь он ещё не использовался (откуда комп знает сколько их там? О_О) или выполнение функций идёт не по порядку?
Старый 05.03.2008, 17:17
J
expert
offline
Опыт: 48,447
Активность:
happy_horror сделай чтобы функции где использовались GetForLoopIndexA() принимаи поаметром целочисленую переменую, и в цыкле вызывай эти функции передавая к ним счетчик цыкла этим пораметром, и вместо GetForLoopIndexA используй этот пораметр
Старый 05.03.2008, 17:27
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Хмм...это вроде и так есть с Index A (если я правильно понял) - а что делать в случае, если у меня цикл считается локальной переменной?

Кстати попутный вопрос: если у меня есть массив глобальных переменных и я хочу в каждую локальную переменную записать значение глобальной переменной, какой нужен индекс в этом случае?

Я так понимаю это будет выглядеть как
Код:
set i(индекс) = udg_i(индекс)


?

Отредактировано happy_horror, 05.03.2008 в 17:37.
Старый 05.03.2008, 17:32
J
expert
offline
Опыт: 48,447
Активность:
Код:
function Trig_Cast_2_Func003Func003A takes integer indexA returns nothing
    local unit Enum = GetEnumUnit()
    if GetUnitUserData(Enum) + indexA ) <= 12 then
        call IssuePointOrderLocBJ(Enum, "move", udg_AirStrikePoints[    GetUnitUserData(Enum) + indexA])
    else
        call IssuePointOrderLocBJ(Enum, "move", udg_AirStrikePoints[-12+GetUnitUserData(Enum) + indexA])
    endif
endfunction

function Trig_Cast_2_Actions takes nothing returns nothing
    local integer a = 1
    loop
        exitwhen a > 12
        set udg_AirStrikePoints[a] = PolarProjectionBJ(GetSpellTargetLoc(), udg_AirStrikeLevel*150, 30 * a)
        set a = a + 1
    endloop
    ...
Старый 05.03.2008, 17:37
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
indexA это глобальная переменная типа integer?

Если у меня массив локальных юнитов то возможно записать так:

Код:
local unit array Enum() = GetEnumUnit()
    if GetUnitUserData(Enum()) + bj_forLoopAIndex ) <= 12 then
        call IssuePointOrderLocBJ(Enum(), "move", udg_AirStrikePoints[    GetUnitUserData(Enum()) + bj_forLoopAIndex])
    else
        call IssuePointOrderLocBJ(Enum(), "move", udg_AirStrikePoints[-12+GetUnitUserData(Enum()) + bj_forLoopAIndex])
    endif


?
Старый 05.03.2008, 18:00
J
expert
offline
Опыт: 48,447
Активность:
happy_horror это пораметр!! в функции верху написан!!:
Код:
function Trig_Cast_2_Func003Func003A takes integer indexA returns nothing


Jon добавил:
если используеш эту функцию в этой своем цыкле например, то передавай индекс как пораметр
Код:
call Trig_Cast_2_Func003Func003A(a)
Старый 05.03.2008, 18:04
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
Мда, что-то я сам дотумкать не могу...вот весть тригер

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

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

function Trig_Cast_u_Func003Func003Func001001 takes nothing returns boolean
    return ( ( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() ) <= 12 )
endfunction

function Trig_Cast_u_Func003Func003A takes nothing returns nothing
    if ( Trig_Cast_u_Func003Func003Func001001() ) then
        call IssuePointOrderLocBJ( GetEnumUnit(), "move", udg_AirStrikePoints[( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() )] )
    else
        call IssuePointOrderLocBJ( GetEnumUnit(), "move", udg_AirStrikePoints[( -12 + ( GetUnitUserData(GetEnumUnit()) + GetForLoopIndexA() ) )] )
    endif
endfunction

function Trig_Cast_u_Actions takes nothing returns nothing
        local integer lvl = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId())
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set udg_AirStrikePoints[GetForLoopIndexA()] = PolarProjectionBJ(GetSpellTargetLoc(), ( I2R(udg_AirStrikeLevel) * 150.00 ), I2R(( 30 * GetForLoopIndexA() )))
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = ( udg_AirStrikeLevel * 4 )
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), udg_AirStrikePoints[( ( ( GetForLoopIndexA() - 1 ) * ( 4 - udg_AirStrikeLevel ) ) + 1 )], bj_UNIT_FACING )
        set udg_AirStrikeCopters[GetForLoopIndexA()] = GetLastCreatedUnit()
        call SetUnitUserData(udg_AirStrikeCopters[GetForLoopIndexA()], (GetForLoopIndexA()-1)*(4-udg_AirStrikeLevel)+1)
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call ForGroupBJ( GetUnitsOfPlayerAndTypeId(Player(0), 'h000'), function Trig_Cast_u_Func003Func001A )
        call TriggerSleepAction( 0.50 )
        call ForGroupBJ( GetUnitsOfPlayerAndTypeId(Player(0), 'h000'), function Trig_Cast_u_Func003Func003A )
        call TriggerSleepAction( 0.20 )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 12
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        call ExplodeUnitBJ( udg_AirStrikeCopters[GetForLoopIndexA()] )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
endfunction

//===========================================================================
function InitTrig_Cast_u takes nothing returns nothing
    set gg_trg_Cast_u = CreateTrigger(  )
    call DisableTrigger( gg_trg_Cast_u )
    call TriggerRegisterUnitEvent( gg_trg_Cast_u, gg_unit_N000_0000, EVENT_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Cast_u, Condition( function Trig_Cast_u_Conditions ) )
    call TriggerAddAction( gg_trg_Cast_u, function Trig_Cast_u_Actions )
endfunction


я собственно пытаюсь изменить его с преминением только локалок, т.к. тут есть действие TrigSleepAction, но ни как не могу понять, как мне "слепить" функции в одну ( где понадобятся одни и те же локалки)...

Тригер-заклинание, действие: суммонятся юниты по окружности (количество зависит от левла абилки) и двигаясь против часовой стрелки стреляют каждый по 12 раз, затем взрываются
Старый 05.03.2008, 18:15
J
expert
offline
Опыт: 48,447
Активность:
http://xgm.guru/forum/showpost.php?p=365279&postcount=4
ForGroupBJ - это и есть Отряд-Pick юнитов о котором я говорил, тут только через глабалки, через локалки не получится...

хотя у тебя както страно, пик юнитов да еще и в цыкле, мне кажется тебе недо изменить алгоритм и там все без цыкла можно будет сделать, или перетащить цыкл внутрь пика... но это только на первый взгляд...

и вообще я думаю тебе рано этим заниматся, судя по твоим постам тебе надо еще парочку раз статьи по джазу почитать, а потом еще раз попытатся...
Старый 05.03.2008, 18:28
happy_horror
2 + 2 = 22 :-D
offline
Опыт: 7,818
Активность:
А с чего тада начинать? читал статьи 2 раза, особо нового ничего не узнал, т.к. там нет примеров всех тригеров и устройст функций... в остальном всё не сложно...
Кстати говоря - этот тригер делал не я, я его как раз таки со статей и скачал, там предлогалось усовершенствовать его (использовать лок перем), только не показано как :D:
Кстати, а не мог бы ты мне подробно объяснить устройство этого спела, может тада я пойму, что к чему...думаю это для тебя проще, чем мне самому разбирать его)

Отредактировано happy_horror, 05.03.2008 в 20:15.
Старый 05.03.2008, 18:54
Ответ

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

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

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

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



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