[Вопрос] Удаление всех мёртвых из группы юнитов.
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 12:21:16 | Сообщение # 1 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Вопрос такой:в некоторой переменной типа group записаны вперемешку живые и мёртвые юниты. Есть ли простой способ "отсеять" оттуда всех мертвяков, не прибегая к использованию цикла?
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 12:33:25 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code function Trig_YourTrig_RemoveDead takes nothing returns nothing if GetWidgetLife(GetEnumUnit()) <= .405 then call GroupRemoveUnit(udg_Group, GetEnumUnit()) endif endfunction
//... call ForGroup(udg_Group, function Trig_YourTrig_RemoveDead) //...
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 15:19:33 | Сообщение # 3 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Спасибо! А нет ли вариантов без использования дополнительной функции? Просто такой вариант не прокатит для локальной группы...
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 15:35:47 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Ник, а IsUnitType(unit, UNIT_TYPE_DEAD) работает медленнее?
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 16:44:07 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| GetWidgetLife(...) работает быстрее, однако возможны баги из-за криворукости кодера. Если мертвому юниту установить жизнь выше нуля, GetWidgetLife покажет, что юнит жив. Есть еще один вариант. Можно объявить в коде нативку из common.ai. По производительности она находится где-то между ними, но мертвых обрабатывает корректно.Code native UnitAlive takes unit id returns boolean Quote (Позитроныч) А нет ли вариантов без использования дополнительной функции? Не думаю. Просто перед перебором юнитов установи глобальную группу = локальная.
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 17:03:37 | Сообщение # 6 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| А объявление нативок- не vjass?
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 17:06:37 | Сообщение # 7 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| vJASS.
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 17:07:20 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Прощай кроссредакторность
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 17:09:20 | Сообщение # 9 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| То есть нет, нативки можно объявлять и в JASS2, но нужно делать это сразу после блока globals, т. е. нужно вскрывать карту архиватором и вписывать их в код вручную. JassHelper переносит их туда сам.
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 17:11:42 | Сообщение # 10 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Понятно. Спасибо за информацию
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 19:31:31 | Сообщение # 11 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| В общем, я решил, что лучше будет сделать так: Code call GroupEnumUnitsInRange(group, GetLocationX(poz3), GetLocationY(poz3), 80, Condition(function IsUnitType(GetEnumUnit(), UNIT_TYPE_DEAD)==false)) Вопрос в том, что работать таким образом варик не хочет, похоже, придётся добавлять свою функцию и прописывать returns IsUnitType(GetEnumUnit(), UNIT_TYPE_DEAD)==false.
|
|
|
|
SirNikolas | Дата: Вторник, 07 Февраля 2012, 19:51:07 | Сообщение # 12 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Позитроныч) придётся добавлять свою функцию и прописывать returns IsUnitType(GetEnumUnit(), UNIT_TYPE_DEAD)==false. Именно так. Только используй Filter, а не Condition при работе с группами.
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 20:24:32 | Сообщение # 13 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Code function RemoveDead takes unit GetEnumUnit() returns boolean return IsUnitType(GetEnumUnit(), UNIT_TYPE_DEAD)==false endfunction Такой вариант не работает, как и ожидалось.. Какого юнита, в таком случае, должна брать функция, если не GetEnumUnit?
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 20:26:12 | Сообщение # 14 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| GetFilterUnit(). Но лучше нулевой фильтр и перебор циклом
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 20:47:13 | Сообщение # 15 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Вот что в итоге получилось: Code ... call GroupEnumUnitsInRange(group, GetLocationX(poz3), GetLocationY(poz3), 80, Filter(function RemoveDead)) ... function RemoveDead takes unit GetFilterUnit() returns boolean return IsUnitType(GetEnumUnit(), UNIT_TYPE_DEAD)==false endfunction Опять не работает. Что тут не так? Приношу извинения за раздолбайство.Добавлено (07 Февраль 2012, 20:47:13) ---------------------------------------------
Code ... call GroupEnumUnitsInRange(group, GetLocationX(poz3), GetLocationY(poz3), 80, Filter(function RemoveDead)) ... function RemoveDead takes unit GetFilterUnit() returns boolean return IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD)==false endfunction Так тоже не работает...
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 20:53:57 | Сообщение # 16 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Это не си, плюсы и прочее. Вызываемая функция должна быть над функцией, в которой она вызывается. То есть функу фильтра перенеси вверх Добавлено (07 Февраль 2012, 20:52:17) --------------------------------------------- Два- фильтр не должен ничего брать Добавлено (07 Февраль 2012, 20:53:57) --------------------------------------------- Реальную 80 запиши в виде 80. дабы исключить неявный конверт
|
|
|
|
Позитроныч | Дата: Вторник, 07 Февраля 2012, 21:15:51 | Сообщение # 17 |
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
| Спасибо!Всё заработало! з.ы.Функция фильтра итак была наверху,просто я по-еврейски код скопировал...
|
|
|
|
Ty3uK | Дата: Вторник, 07 Февраля 2012, 21:20:06 | Сообщение # 18 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Бывает кто из шарящих придет и с компа- напишите функу с нулевым фильтром и циклом, ибо это быстрее работает. С телефона написать не могу \n увы
|
|
|
|
SirNikolas | Дата: Среда, 08 Февраля 2012, 10:21:29 | Сообщение # 19 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) Это не си, плюсы и прочее. В Си и Плюсах это правило тоже действует. Это в C# такого нет.
Вариант с циклом:Code local unit u call GroupEnumUnitsInRange(udg_Group, GetLocationX(pos3), GetLocationY(pos3), 80., null) loop set u = FirstOfGroup(udg_Group) exitwhen u == null call GroupRemoveUnit(udg_Group, u) if GetWidgetLife(u) > .405 then //Действия endif endloop Добавлено (08 Февраль 2012, 10:21:29) --------------------------------------------- Но он не подойдет, если юниты должны остаться в группе.
|
|
|
|