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

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

Закрытая тема
 
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
Вычислить юнита, который ближе всех
К примеру: в группе 4 юнита, которые пикнуты героем после любого действия. Нужно вычислить, какой юнит из группы находится ближе к герою
если можно, то на примере каком-нибудь
Старый 06.03.2012, 15:04
16GB
GhostOne User
offline
Опыт: 59,317
Активность:
udg_G - глобальная группа

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 returns unit
local unit tmp = null
local unit u = null
local real d = 0.
local real c = 2000. //максимальное расстояние между героем и юнитами
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
Старый 06.03.2012, 15:15
ScorpioT1000
Работаем
offline
Опыт: отключен
16GB,
названия твоих функций - пример быдлоговнокода.
Никогда не называйте так функции, у нас за такое бы яйца оторвали)

Отредактировано ScorpioT1000, 06.03.2012 в 15:59.
Старый 06.03.2012, 15:29
Klop
Папа римский
offline
Опыт: 13,006
Активность:
переменная мин = Присваивай значение первого юнита в группе
делаей цикл для группы
и считай расстоянии и сравнивай с мин если меньше присваивай мин меньшее значение
в итоге в мин будет у тебя минимальное расстояние
Klop добавил:
вот тема изучай
Старый 06.03.2012, 19:53
adic3x

offline
Опыт: 107,539
Активность:
Снизошел:
// cJass 1.4.2.40
// Автообнуление локальных переменных должно быть включено.
// Функция вернет null, если поблизости нет ни одного юнита.

unit GetNearestUnit (real x, real y, real radius) {
    real dist = radius + 1.;
    unit u = null;
    for (unit n; UnitsInRange (x, y, radius) {
        real xx = x - GetUnitX (n);
        real yy = y - GetUnitY (n);
        real d = SquareRoot (yy*yy + xx*xx);
        if (dist > d) {
            dist = d;
            u = n;
        }
    }
    return u;
}
Старый 06.03.2012, 20:38
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
всем спасибо кто старался =)
ADOLF, отдельно спасибо, то что нужно)

можно закрывать
Старый 06.03.2012, 22:17
Doc

offline
Опыт: 63,163
Активность:
unit GetNearestUnit(real x, real y, real radius) {
    radius *= radius
    real dist = radius + 1.
    unit u = null
    for (unit n; UnitsInRange(x, y, radius) {
        real xx = x - GetUnitX(n)
        real yy = y - GetUnitY(n)
        real d = yy * yy + xx * xx
        if (dist > d) {
            dist = d
            u = n
        }
    }
    return u
}
Старый 07.03.2012, 22:32
Закрытая тема

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

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

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

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



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