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

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

Закрытая тема
 
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
BJ функция GetUnitsInRangeOfLocMatching, вызывает ли она утечки?
Собственно использую её в

Код:
set Z = GetUnitsInRangeOfLocMatching(100000.00, Marine, Condition(function Zombies))
    set G = GetUnitsInRangeOfLocMatching(100000.00, Marine, Condition(function Gargoyles))
    set N = GetUnitsInRangeOfLocMatching(100000.00, Marine, Condition(function Necromancers))
    set H = GetUnitsInRangeOfLocMatching(100000.00, Marine, Condition(function HumanHunters))


сама BJ это :

Код:
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction


допустим сделаю так:

Код:
local group t = CreateGroup() // в начале функции задам такую локалку...

set G = GroupEnumUnitsInRangeOfLoc(t, Marine,100000.00, Condition(function Gargoyles)) // так для каждой переменной


То куда девать call DestroyBoolExpr(filter) ?


Нашёл причину не работы триггера...

Щас подумаю, как можно заменить эту функцию

Отредактировано Ranger21, 13.03.2009 в 21:16.
Старый 13.03.2009, 20:31
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Ranger21, утечка создается, видишь после
Код:
//...
return g

Локалка не обнуляется, подумай как можно заменить.
Старый 13.03.2009, 20:56
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
set G = GroupEnumUnitsInRangeOfLoc(t, Marine,100000.00, Condition(function Gargoyles))
а почему пишет Cannot Convert nothing to group ?
G - группа
t - группа
Marine - точка
Или надо так
call GroupEnumUnitsInRangeOfLoc(t, loc,100000.00, Condition(function Gargoyles))
call ForGroup(t, function Attack)
call DestroyGroup(t)
?
И если у меня 4ре разных типов юнитов, то просто писать
call GroupEnumUnitsInRangeOfLoc(Z, loc,100000.00, Condition(function Zombies))
call ForGroup(Z, function Attack)
call DestroyGroup(Z)
?
И куда девать всётки call DestroyBoolExpr(filter) ?
Старый 13.03.2009, 21:59
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Ranger21
Код:
call GroupEnumUnitsInRangeOfLoc(t, loc,100000.00, Condition(function Gargoyles))
call ForGroup(t, function Attack)
call DestroyGroup(t)

Так.
Код:
call DestroyBoolExpr(filter)

Девать в окончание действия, т.е. конечный вариант
Код:
call GroupEnumUnitsInRangeOfLoc(t, loc,100000.00, Condition(function Gargoyles))
call ForGroup(t, function Attack)
call DestroyGroup(t)
call DestroyBoolExpr(filter)
Старый 13.03.2009, 22:23
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
С этим разобрался, а позволительно использовать одну группу на все типы юнитов? Удаляя старую группу и в конце присваивая значение Z= null

Вопрос собственно, обнулять группу надо после удаления её или можно в конце?

PS: Все эти юниты атакуют одних и тех же...

Ведь если в начале задана local group Z=CreateGroup(),
а в функции написать set Z = null, то следующий call GroupEnumUnitsInRangeOfLoc(Z,блабла)
не будет работать, так как у нас Z = null ?

Вот пример части кода, относящийся именно к этим действиям
Код:
local group Z=CreateGroup()
call GroupEnumUnitsInRangeOfLoc(Z, loc,100000.00, Condition(function Zombies))
    call ForGroup(Z, function Attack)
    call DestroyGroup(Z)
    call DestroyBoolExpr(Condition(function Zombies))
    call GroupEnumUnitsInRangeOfLoc(Z, loc,100000.00, Condition(function Gargoyles))
    call ForGroup(Z, function Attack)
    call DestroyGroup(Z)
    call DestroyBoolExpr(Condition(function Gargoyles))
    call GroupEnumUnitsInRangeOfLoc(Z, loc,100000.00, Condition(function Necromancers))
    call ForGroup(Z, function Attack)
    call DestroyGroup(Z)
set Z = null
Старый 13.03.2009, 22:34
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Цитата:
Ведь если в начале задана local group Z=CreateGroup(),
а в функции написать set Z = null, то следующий call GroupEnumUnitsInRangeOfLoc(Z,блабла)
не будет работать, так как у нас Z = null ?

true

С одной и той же переменной можно свободно работать. Писать
Код:
set Z=null

Только когда переменная перестанет нужна вообще. Воибежание багов пиши
Код:
call ClearGroup(Z)

После того, как будешь использовать старую переменную для новой группы.
Старый 13.03.2009, 22:39
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Может быть ты имел ввиду call DestroyGroup(Z) ?

call ClearGroup(Z) такой функции нету.

так если это true... значит для использования переменной заново надо и

Код:
call DestroyGroup(Z)
call GroupClear(Z)
Z=CreateGroup()




Пойду тестить и пробывать


EDIT : GroupClear ты имел ввиду?=)
Старый 13.03.2009, 22:43
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Всё работает отлично!) Не думал, что собственоручное написание триггера на джассе принесёт мне сток удовольствия.
Вродь топик можно закрывать...
Старый 13.03.2009, 22:50
SRes
1110101000
offline
Опыт: 9,997
Активность:
Хм, а может быть сделать через boolexpr и сразу в ней все действия проводить ? Т.е., :
Код:
local boolexpr cfg = Condition(function Zombies)
local group Z=CreateGroup()
call GroupEnumUnitsInRangeOfLoc(Z, loc,100000.00, cfg)
//
call GroupClear(Z)
call DestroyGroup(Z)
set Z = null
call DestroyBoolExpr(cfg)
set cfg = null

А в самом Zombies ты уже проверяешь на тип и действия проделываешь,чтобы узнать какой юнит сейчас "проверяется" есть функция
Код:
GetFilterUnit()
.
Старый 14.03.2009, 09:31
adic3x

offline
Опыт: 108,439
Активность:
2All, вы все нешарите ©

делаеться просто:

Код:
globals
 group gr_temp=CreateGroup()
endglobals

function MyFunc takes nothing returns boolean
 //
 // action with GetFilterUnit() 
 //
 return false
endfunction

// --->
 call GroupEnumUnitsInRange(gr_temp, x, y, radius, Condition(function MyFunc))
// <---
Старый 14.03.2009, 12:07
Закрытая тема

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

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

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

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



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