Сейчас 19:54:17 Вторник, 26 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Удаление всех мёртвых из группы юнитов.
ПозитронычДата: Вторник, 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) работает медленнее?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Вторник, 07 Февраля 2012, 17:06:37 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
vJASS.

 

Ty3uKДата: Вторник, 07 Февраля 2012, 17:07:20 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Прощай кроссредакторность buba

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Вторник, 07 Февраля 2012, 17:09:20 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
То есть нет, нативки можно объявлять и в JASS2, но нужно делать это сразу после блока globals, т. е. нужно вскрывать карту архиватором и вписывать их в код вручную. JassHelper переносит их туда сам.

 

Ty3uKДата: Вторник, 07 Февраля 2012, 17:11:42 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Понятно. Спасибо за информацию ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

ПозитронычДата: Вторник, 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(). Но лучше нулевой фильтр и перебор циклом

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

ПозитронычДата: Вторник, 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. дабы исключить неявный конверт


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

ПозитронычДата: Вторник, 07 Февраля 2012, 21:15:51 | Сообщение # 17
2 уровень
Группа: Пользователи
Сообщений: 32
Награды: 0
Репутация: 0
Блокировки:
Спасибо!Всё заработало!
з.ы.Функция фильтра итак была наверху,просто я по-еврейски код скопировал... :D
 

Ty3uKДата: Вторник, 07 Февраля 2012, 21:20:06 | Сообщение # 18
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Бывает :) кто из шарящих придет и с компа- напишите функу с нулевым фильтром и циклом, ибо это быстрее работает. С телефона написать не могу \n увы

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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)
---------------------------------------------
Но он не подойдет, если юниты должны остаться в группе.


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz