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

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

Ответ
 
IES

offline
Опыт: 4,995
Активность:
Определение самого близжайшего противника
Arcane Bolt - Dragonus направляет во врагов аркановую энергию. Наносит урон, равный 1.5x от его интеллекта и дает видимость в 325 ед. вокруг снаряда в течение его полета.
Concussive Shot - Skywrath Mage направляет компактный шар магической молнии в близжайших врагов в 1600 АоЕ. При ударе шар взрывается, замедляя врагов на 40% на 4 секунды и наносит урон вокруг цели.
Попробовал сделать эту способность(p.s.Нет я не делаю карут аля дота,я вообще не делаю карт просто захожу в ВЕ побаловаться).

Почти все получилось, нужна ваша помощь.Как определить самого ближайшего противника?(героя).
В своем спелле я явно намудрил:(
Прикрепленные файлы
Тип файла: w3x spell1.w3x (14.7 Кбайт, 4 просмотров )

Отредактировано Кет, 23.01.2013 в 16:06.
Старый 23.01.2013, 06:36
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
IES, Мой задротческий вариант, многим не понравится но работает исправно(в шапку карты)
» КОД
function FilterMostNearUnit takes group g ,unit Unit returns nothing
    local unit ufil//проверяемый юнит
    local real xu//X проверяемого юнита
    local real yu//Y проверяемого юнита
    local real duU//дистанция от проверяемого юнита до юнита от которого ведется отсчет
    local real x1U//X юнита Глобалки
    local real y1U//Y юнита Глобалки
    local real d1UUF//дистанция от юнита от которого ведется отсчет до Глобалки
    local real X = GetUnitX(Unit)//X юнита от которого ведется отсчет
    local real Y = GetUnitY(Unit)//Y юнита от которого ведется отсчет
    loop
    set ufil = FirstOfGroup(g)
    exitwhen  ufil == null
    if GetWidgetLife(ufil) > 0.405  and ufil!=Unit and (IsUnitType(ufil, UNIT_TYPE_STRUCTURE)==false) and GetOwningPlayer(ufil) != GetOwningPlayer(Unit) then//Unit_FilterMostNearUnit
        set xu=GetUnitX(ufil)
        set yu=GetUnitY(ufil)
        set x1U=GetUnitX(udg_Unit_FilterMostNearUnit)
        set y1U=GetUnitY(udg_Unit_FilterMostNearUnit)
        set  duU=SquareRoot((X-xu)*(X-xu)+(Y-yu)*(Y-yu))
        set d1UUF=SquareRoot((X-x1U)*(X-x1U)+(Y-y1U)*(Y-y1U))
        if udg_Unit_FilterMostNearUnit==null then
          set  udg_Unit_FilterMostNearUnit=ufil
        else
            if duU<d1UUF then
           set  udg_Unit_FilterMostNearUnit=ufil//вот он самый
            endif
        endif
    endif
    call GroupRemoveUnit(g,ufil)
    endloop
    call GroupClear(g)
    call DestroyGroup(g)
    set g = null
endfunction
Старый 23.01.2013, 12:57
IES

offline
Опыт: 4,995
Активность:
Так) Я в шапку это засунул,а дальше как пользоваться этим?:)
Старый 23.01.2013, 17:30
DimanTOoBS

offline
Опыт: 5,791
Активность:
IES,
set Point[1] = GetPositionUnit(Caster)
set NearUnit = null
pick every units in Group
if (NearUnit = null) then (set NearUnit = PickedUnit)
else (set Point[2] = GetPositionUnit(PickedUnit); set Point[3] = GetPosition(NearUnit);
if (Distance between Point[1] and Point[2] < Distance between Point[1] and Point[3]) then (set NearUnit = PickedUnit);
call RemoveLocation(Point[2]);
call RemoveLocation(Point[3]))
call RemoveLocation(Point[1])
Старый 23.01.2013, 17:51
ScorpioT1000
Работаем
online
Опыт: отключен
Вы серьезно по всем юнитам на карте решили циклом пройтись?))))
Старый 23.01.2013, 17:54
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
function FDFD takes unit u,unit u2 returns real
local real dx = GetUnitX(u2)-GetUnitX(u)
local real dy = GetUnitY(u2)-GetUnitY(u)
return SquareRoot(dx*dx+dy*dy)
endfunction

function GetClosest takes unit h,group g,real c returns unit
local unit tmp = null
local unit u = null
local real d = 0.
call GroupClear(udg_G)
set bj_groupAddGroupDest = udg_G
call ForGroup(g,function GroupAddGroupEnum)
loop
set tmp = FirstOfGroup(udg_G)
if tmp != null then
set d = FDFD(h,tmp)
if d < c then
set c = d
set u = tmp
endif
endif
call GroupRemoveUnit(udg_G,tmp)
exitwhen tmp == null
endloop
return u
endfunction
Старый 23.01.2013, 18:01
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,467
Активность:
ScorpioT1000, конечно серьёзно, (их там полюбак штук 300) - Таков путь упоротых!
Они же не понимают что это неправильно и будет лагать в муи, но прb тесте же не лагает - значит норм...
Старый 23.01.2013, 18:01
ScorpioT1000
Работаем
online
Опыт: отключен
Ну у меня около 800 было с дгуи, хотел бы я посмотреть как 800 раз обойти 800 юнитов <3
С этими все ясно, для случайных посетителей темы: не стоит делать обход юнитов, стоит иметь массив юнитов и 2 массива индексов (x, y) от первого массива.
Сами массивы индексов сортируются по координатам юнитов, сортировка вызывается периодически.
Поиск производится по сортированным массивам индексов за очень короткое время.
Старый 23.01.2013, 18:12
IES

offline
Опыт: 4,995
Активность:
quq_CCCP:
ScorpioT1000, конечно серьёзно, (их там полюбак штук 300) - Таков путь упоротых!
Они же не понимают что это неправильно и будет лагать в муи, но прb тесте же не лагает - значит норм...
Я же говорил,что мой скил в ВЕ очень слаб^_^
Старый 23.01.2013, 18:51
Ответ

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

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

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

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



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