ScopteRectuS, немного неточно написал. Не только "Specific...", но и еще другие подобные события, например, "Unit's life becomes...", "Unit state event" и т.д. Но и в Specific'е, кстати, тоже есть полезное, например, "Обнаружил противника в зоне досягаемости" - для написания ИИ в самый раз.
Например, такая ситуация: некая способность применяется как на боевую единицу, так и на здания, но здание приоритетно, поэтому, при обнаружении в зоне досягаемости здания, боевая единица получает приказ применить способность на нем.
А что именно нужно? Исключать всех не тех или отсеять? Можно копировать группу, вставить одну группу в другую, есть соотвествующие функции, размножили одну группу по массиву и перебирайте сколько влезет, после удаляйте.
иметь две группы. Есть группа, которую нужно обработать. Создаете еще одну. По ходу цикла в одну добавляете юнита (сохраняете), а из другой удаляете (чтобы выполнился цикл).
Именно таким способом и делал. Значит, только так?
Но у тебя BJ-функция GetUnitsInRectOfPlayer утекает =(( и группой в конце не удаляем
Правильно ли я понимаю, что любая функция, возвращающая объект, "утекает", а избежать утечки можно, записав этот объект в переменную и затем, по окончании работы функции, удалив? То есть, такой код содержит утечки памяти:
group units = GetUnitsInRectOfPlayer(GetPlayableMapRect(), Player(id))
А такой - не содержит:
player pl = Player(id)
rect map = GetPlayableMapRect()
group units = GetUnitsInRectOfPlayer(map, pl)
...
RemovePlayer(pl)
RemoveRect(map)
DestroyGroup(units)
Немного переосмыслил предыдущий ответ. На деле, функции типа "RemovePlayer", "RemoveUnit" и т.д., удаляют объекты, и данные объекты удалятся из игры вообще. То есть, если в событии "Боевая единица умирает" получить "KillingUnit" (убивший), и затем вызвать к нему "RemoveUnit()", то и эта боевая единица, также, удалится с карты.
То есть, удалять объекты, во избежание утечек, надо только в тех ситуациях, когда вызванная функция генерирует новый объект, который не используется после завершения работы функции. Здесь поможет только понимание внутренней логики работы этих функций и, в общем, игры. В остальных случаях, думаю, достаточно просто "map = null", притом, как мне кажется, эта строка будет равносильна "int = 0" (обнулению числовой переменной), то есть, в ней отсутствует острая необходимость (только если количество ссылок на объекты не учитывается интерпретатором, как в некоторых современных языках программирования).
Думаю, это верное понимание, возможно, в деталях был неточен.
Вообще, функция "GetPlayerUnitCount()" делает то, что нужно: считает количество боевых единиц (не зданий) у игрока. Единственное - считает, также, и вызванных. Поэтому без перебора, возможно, обойтись и не удастся.
» WarCraft 3 / Почему в GenericUnitEvent отсутствуют некоторые события?
Например, такая ситуация: некая способность применяется как на боевую единицу, так и на здания, но здание приоритетно, поэтому, при обнаружении в зоне досягаемости здания, боевая единица получает приказ применить способность на нем.
» WarCraft 3 / Как отследить способность, которой была вызвана иллюзия?
» WarCraft 3 / Как отследить способность, которой была вызвана иллюзия?
» WarCraft 3 / Как отследить способность, которой была вызвана иллюзия?
» WarCraft 3 / Как совершить обход по объекту group?
» WarCraft 3 / Как совершить обход по объекту group?
» WarCraft 3 / Как на Jass быстро посчитать количество боевых единиц?
» WarCraft 3 / Как на Jass быстро посчитать количество боевых единиц?
» WarCraft 3 / Как на Jass быстро посчитать количество боевых единиц?
» WarCraft 3 / Как на Jass быстро посчитать количество боевых единиц?