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

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

Закрытая тема
 
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Как правильно пользоваться "ForGroupBJ"
Вот делаю триггер который к примеру будет двигать каждого юнита в рандомную зону каждые 2 сек!(это для примера)
Код:
function fGroup takes nothing returns nothing
    call SetUnitPositionLoc( GetEnumUnit(), GetRandomLocInRect(GetPlayableMapRect()) )
endfunction

function Trig_tGr1_Actions takes nothing returns nothing
local real r = 0.00
    call ForGroupBJ( udg_myGroup, function fGroup )
endfunction

//===========================================================================
function InitTrig_tGr1 takes nothing returns nothing
    set gg_trg_tGr1 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_tGr1, 2 )
    call TriggerAddAction( gg_trg_tGr1, function Trig_tGr1_Actions )
endfunction


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

Ну или же как сделать так чтобы эта функция брала нужное мне значение например значение переменной "r". Ведь там же нельзя использовать call fGroup(r) так как там используется так: call ForGroupBJ( udg_myGroup, function fGroup )

p.s. Извиняюсь за нубское объяснение проблемы, просто не мог придумать как по другому изложить суть!

p.s.s. Не обращайте внимание что триггер бессмысленный, это я лишь пример привел!
Старый 21.10.2008, 07:15
Dragon Knight
Меткий стрелок!!!
offline
Опыт: 4,138
Активность:
Код:
function Trig_tGr1_Actions takes nothing returns nothing
    local group g=CreateGroup()
    local unit gu
    call GroupEnumUnitsIn<Каким способом заполнять группу>(g,Filter)
    loop
          set gu=FirstOfGroup(g)
          exitwhen gu==null
          ...
          call GroupRemoveUnit(g,gu)
          set gu=null
    endloop

    //Но если группа нужна в дальнейшем ,то лучше сделать копию группы и использовать в цикле
Старый 21.10.2008, 08:27
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
call GroupEnumUnitsIn<Каким способом заполнять группу>(g,Filter)

Filter-что это?
Старый 21.10.2008, 08:49
J
expert
offline
Опыт: 48,447
Активность:
GresAHT это тоже самое как условие в триггере, в подобном фильтере будет доступна функция GetFilterUnit(), если функция вернут тру, то даного юнита включат в группу указаную в функции GroupEnumUnitsIn<Каким способом заполнять группу>(), если false - то нет

и вобще лупом по группе пользоватся не рекомендуемо, т.е. можеш конешно, но оптимальнее будет действие указывать в фильтре, отдельной функцией тобиш...
Старый 21.10.2008, 12:58
agentex

offline
Опыт: 34,834
Активность:
Цитата:
Но мне нужно чтобы действия выполнялись не в отдельной функции(fGroup) а напрямую в триггере...

нескока месяцев назад задавал я этот же вопрос тут..
вразумительного ответа не получил и с тех пор юзаю луп + ифы

Dragon Knight,
call GroupEnumUnitsIn<Каким способом заполнять группу>(g,Filter)
это строка вообще не в тему, ведь автор спрашивает как обойтись БЕЗ фильтра наскока я понял

exitwhen gu==null
а это бесконечный цикл в некоторых случаях
Старый 21.10.2008, 15:53
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
exitwhen gu==null
а это бесконечный цикл в некоторых случаях

обоснуй
Старый 21.10.2008, 16:14
agentex

offline
Опыт: 34,834
Активность:
ну например если в gu не передастся значение null))) у меня такое просто было

agentex добавил:
поэтому я делаю так
local integer count = CountUnitsInGroup(g)
...
set count = count - 1
exitwhen count == 0
Старый 21.10.2008, 16:27
Лось

offline
Опыт: 7,223
Активность:
Если группа пустая то FirstOfGroup возвращяет null.
У меня всё нормально было, сколько не делал.
Старый 21.10.2008, 16:29
agentex

offline
Опыт: 34,834
Активность:
ты просто везучий)
Старый 21.10.2008, 16:30
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
поэтому я делаю так
local integer count = CountUnitsInGroup(g)
...
set count = count - 1
exitwhen count == 0
бред
ты наверно просто забывал юнита под конец из группы удалять...
Старый 21.10.2008, 16:46
agentex

offline
Опыт: 34,834
Активность:
Цитата:
ты наверно просто забывал юнита под конец из группы удалять...

мб непомню давно сталкивался с этим косяком
Цитата:
бред

обоснуй )
Старый 21.10.2008, 16:50
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Все понятно кроме вот этого:
Код:
call GroupEnumUnitsIn<Каким способом заполнять группу>(g,Filter)


<Каким способом заполнять группу> - вот это! Здесь нужно вставлять нужные мне условия?

Если можно напишите наипростейший пример...
Старый 21.10.2008, 18:01
ScorpioT1000
Работаем
offline
Опыт: отключен
да нату тут никаких кроликов, ты просто чтото нето делал =)
Старый 21.10.2008, 18:12
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
GRES, просто есть несколько функций:
Код:
native GroupEnumUnitsInRange takes group whichGroup, real x, real y, real radius, boolexpr filter returns nothing

native GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing

native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsInRect takes group whichGroup, rect r, boolexpr filter returns nothing

native GroupEnumUnitsInRectCounted takes group whichGroup, rect r, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsOfPlayer takes group whichGroup, player whichPlayer, boolexpr filter returns nothing

native GroupEnumUnitsOfType takes group whichGroup, string unitname, boolexpr filter returns nothing

native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname, boolexpr filter, integer countLimit returns nothing

native GroupEnumUnitsSelected takes group whichGroup, player whichPlayer, boolexpr filter returns nothing
Старый 21.10.2008, 21:57
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
А если мне нужно будет выбрать всех юнитов игрока Красного в радиусе 400 от области Zona! Можно ли использовать такое сочетание?

Код:
call ( GroupEnumUnitsInRangeOfLoc(group, Zona, 400.00, Filter) ) and ( GroupEnumUnitsOfPlayer(group, 0, Filter) )


Или придеться выберать всех юнитов в радиусе а потом проверять через If принадлежит ли добавленный юнит игроку Красному и если не принадлежит то удалять его из группы?
Старый 23.10.2008, 07:28
Лось

offline
Опыт: 7,223
Активность:
Нет, надо юзать фильтер.
Код:
function RedUnitsFilter takes nothing returns boolean
    return GetOwningPlayer(GetFilterUnit()) == Player(0)
endfunction

function PickRedUnits takes nothing returns nothing
    local group g = CreateGroup()
    local boolexpr cfg = Condition(function RedUnitsFilter)
    local location zona = Location(0,0)
    call GroupEnumUnitsInRangeOfLoc(g,zona,400,cfg)
endfunction
Старый 23.10.2008, 08:01
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Всем спасибо за помощь! Пошел разбираться! :):
Старый 23.10.2008, 14:04
Закрытая тема

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

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

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

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



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