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

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

Ответ
 
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Ближайший юнит
Пожалуйста выложите функцию которая находит ближайшего юнита
искал в поиске но натыкался только на обсуждение как найти ближайшего юнита, но не на сому функцию. Так же пытался сам зделать но не получилось (хз почему)
Старый 26.10.2008, 11:08
zer0ne

offline
Опыт: 11,219
Активность:
ближайшего к чему?
Старый 26.10.2008, 11:17
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
к точке
Старый 26.10.2008, 11:19
agentex

offline
Опыт: 34,834
Активность:
Код:
function GetNearestUnit takes location l returns unit
local group g = CreateGroup()
local real mindst = 999999
local unit mindstu = null
local unit u = null
local location ul = null
call GroupEnumUnitsInRangeOfLoc(g, l, 999999, null)
loop
set u = FirstOfGroup(g)
if u != null then
set ul = GetUnitLoc(u)
if DistanceBetweenPoints(l, ul) < mindst then
  set mindst = DistanceBetweenPoints(l, ul)
  set mindstu = u
endif
call RemoveLocation(ul)
call GroupRemoveUnit(g, u)
endif
exitwhen u == null
endloop
call DestroyGroup(g)
set g = null
set ul = null
return mindstu
endfunction

хз по идеи как то так...

agentex добавил:
знаю что 999999 это бред но больше ничего не придумал ;(

Отредактировано agentex, 29.10.2008 в 20:59.
Старый 26.10.2008, 11:37
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
ща проверю
Старый 26.10.2008, 11:50
J
expert
offline
Опыт: 48,447
Активность:
Код:
globals
    group GG = CreateGroup()
    //
    filterfunc NearestUnitFilter
    real NearestX
    real NearestY
    unit NearestUnit = null
    real NearestDistance
endglobals

function GetNearestUnit_Filter takes nothing returns boolean
    local unit u = GetFilterUnit()
    local real x = GetUnitX(u)-NearestX
    local real y = GetUnitY(u)-NearestY
    local real dis = x*x+y*y
    if dis < NearestDistance then
        set NearestUnit = u
        set NearestDistance = dis
    endif
    set u = null
    return false
endfunction

function GetNearestUnit takes real x, real y, real maxradius returns unit
    set NearestX = x
    set NearestY = Y
    set NearestDistance = maxradius*maxradius
    set NearestUnit = null
    call GroupEnumUnitsInRange(GG, x, y, maxradius, NearestUnitFilter)
    return NearestUnit
endfunction

function Init takes nothing returns nothing
    set NearestUnitFilter = Filter(function GetNearestUnit_Filter)
endfunction

Отредактировано Jon, 26.10.2008 в 18:42.
Старый 26.10.2008, 11:55
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
спс всё работает

vdvMax добавил:
Jon тебе тоже спасибо, но мне твоя функция сложна для понимания
Старый 26.10.2008, 11:58
J
expert
offline
Опыт: 48,447
Активность:
vdvMax а зачем ее понимать? ее вставить и использовать также как ту что написали выше, оптимальнее в несколько раз, если не хочеш делать преинициализацию то убери функцию Init(), убери переменую filterfunc NearestUnitFilter и замени строчку
call GroupEnumUnitsInRange(GG, x, y, maxradius, NearestUnitFilter)
на
call GroupEnumUnitsInRange(GG, x, y, maxradius, Filter(function GetNearestUnit_Filter))
ну естествено чтобы работало надо использовать JNPG, и все...
Старый 26.10.2008, 12:01
adic3x

offline
Опыт: 108,439
Активность:
функция жона правильная, агентекс написал лажу (причем с утечками=/) )
Старый 26.10.2008, 13:27
agentex

offline
Опыт: 34,834
Активность:
утечек нету там, все удаляется!
Старый 26.10.2008, 13:32
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
утечек нету там, все удаляется!
true, но всеравно неправльно так писать...
Старый 26.10.2008, 13:45
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
return mindstu

возращает юнита... это вам не необнуленная локалка часом?)

щас помотрел - код жона имхо неоптимален)
Старый 26.10.2008, 13:56
J
expert
offline
Опыт: 48,447
Активность:
не путай оптимальность, и черезчур большую оптимальноссть, молжно было бы еще локалки не объявлять и делать все на глобалках...

да и группу делать не радиусом от точки, а ректом, т.к. имхо эта функция быстрее... только оптимальность зависит от максимального радиуса... но если предположить что это делается для спелов то обычно использую маленький радиус, и можно ректом принцепи...

Jon добавил:
исправил на рект...
Старый 26.10.2008, 14:03
agentex

offline
Опыт: 34,834
Активность:
Цитата:
возращает юнита... это вам не необнуленная локалка часом?)

омг ну раз так.. исправлено =\
Старый 26.10.2008, 14:17
J
expert
offline
Опыт: 48,447
Активность:
agentex то что ты сделал ни сделает ровным счетом ничего)
Старый 26.10.2008, 14:22
agentex

offline
Опыт: 34,834
Активность:
всмысле? ты иммешь ввиду что ничего не возвратится? кстати у тя тоже тогда утечка:
return NearestUnit
Старый 26.10.2008, 14:23
J
expert
offline
Опыт: 48,447
Активность:
agentex я имею виду что необнуленая локалка так и останется...
Цитата:
кстати у тя тоже тогда утечка:
return NearestUnit
это не локалка
Старый 26.10.2008, 14:38
agentex

offline
Опыт: 34,834
Активность:
дык я же ее обнуляю вроде
Цитата:
return mindstu
set mindstu = null
return null
Старый 26.10.2008, 14:46
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
return mindstu
set mindstu = null
return null

ржунимогу))) лол!

скажите мне пожалуйста что делает ретурн? правильно, это шаг из функции, т.е. после его сработки происходит возрат. и соответсвенно в предложенном коде послеи две строки не будут выполняться никогда

2жон, имхо рект как раз не тру, я говорил о локалках) имхо глобалку тит себя оправадют)
Старый 26.10.2008, 17:12
agentex

offline
Опыт: 34,834
Активность:
Цитата:
скажите мне пожалуйста что делает ретурн? правильно, это шаг из функции, т.е. после его сработки происходит возрат. и соответсвенно в предложенном коде послеи две строки не будут выполняться никогда

а как же тогда работает РБ ?
Старый 26.10.2008, 17:16
Ответ

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

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

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

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



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