Есть способ для каждого юнита в группе получить координаты по X и Y, и потом взять минимум X и Y?
Принятый ответ
Функции дистанции
function GetDistancePoints takes real x1, real y1, real x2, real y2 returns real
return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction
return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction
function GetDistanceUnitPoint takes unit u, real x, real y returns real
local real dx = GetUnitX(u) - x
local real dy = GetUnitY(u) - y
return SquareRoot(dx * dx + dy * dy)
endfunction
local real dx = GetUnitX(u) - x
local real dy = GetUnitY(u) - y
return SquareRoot(dx * dx + dy * dy)
endfunction
function GetDistanceUnits takes unit u1, unit u2 returns real
local real dx = GetUnitX(u1) - GetUnitX(u2)
local real dy = GetUnitY(u1) - GetUnitY(u2)
return SquareRoot(dx * dx + dy * dy)
endfunction
local real dx = GetUnitX(u1) - GetUnitX(u2)
local real dy = GetUnitY(u1) - GetUnitY(u2)
return SquareRoot(dx * dx + dy * dy)
endfunction
Узнать ближайшего юнита к (x, y)
globals
real X
real Y
unit ClosestUnit
real Distance
endglobals
function FindClosestToXYCallback takes nothing returns nothing
local real d = GetDistanceUnitPoint(GetEnumUnit(), X, Y)
if d <= Distance then
set Distance = d
set ClosestUnit = GetEnumUnit()
endif
endfunction
function FindClosestToXY takes group g, real x, real y returns unit
set X = x
set Y = y
set ClosestUnit = null
set Distance = 999999.
call ForGroup(g, function FindClosestToXYCallback)
return ClosestUnit
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован biridius
Отредактирован biridius
а на джассе ForGroup(g, function f) перебирает отряд g и запускает для каждого юнита по очереди функцию f
Отредактирован biridius
Код для выбранных юнитов пишется в отдельной функции.
То что в гуях там все в одном триггере это для вида, на самом деле там создается редактором отдельная функция и поэтому при переборе групп на гуях не действуют локалки из вне перебора.
Отредактирован biridius
перед запуском перебора даем ей очень большое значение типа 99999.
затем внутри перебора сравниваем с X юнита:
biridius:
То есть, типо надо скорее наименьший вектор найти из всех, что ведут к кастеру от каждого в группе.
Отредактирован biridius
Как хранить данные в хеше для спеллов которые длятся какое-то время уже другой вопрос.
biridius:
Отредактирован PT153
return SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
endfunction
local real dx = GetUnitX(u) - x
local real dy = GetUnitY(u) - y
return SquareRoot(dx * dx + dy * dy)
endfunction
local real dx = GetUnitX(u1) - GetUnitX(u2)
local real dy = GetUnitY(u1) - GetUnitY(u2)
return SquareRoot(dx * dx + dy * dy)
endfunction
Отредактирован biridius
нифига тред полетел не, этого не достаточно. см код PT153 для функций расстояния
PT153:
Отредактирован GetLocalPlayer
Параметры в глобалку заносите из основной функции после ожидания, а вот в самой основной функции загружать из хеша.