Добавлен abatyr
Принятый ответ
об этом написано в статье, размер должен быть кратен 128
плюс у триггерных нативок еще смещение от заданной оси, поэтому я всегда юзал dummy-cast предмета нежити, которая наводит порчи. она более точная.
плюс у триггерных нативок еще смещение от заданной оси, поэтому я всегда юзал dummy-cast предмета нежити, которая наводит порчи. она более точная.
да, отсчет действительно начинает не от позиции юнита или каста. юнит или цель каста не будет находится в центре порчи, тк там координаты ищут ближайшие значения, если координата будет 43, то ближайшими координатами будут 0 и 64. там же крайние точки клетки берутся каждые 128 (или 256, точно не могу сказать, говорю на угад).
тестовый код (мб ошибки)
//точечно add/remove blight (заполняется клетка 128х128, а если быть точнее 256x256)
function DummyCastPointBlight takes player whichPlayer, real cx, real cy, real cx0, real cy0, boolean addBlight returns nothing
local unit dummy = CreateUnit( whichPlayer, 'h000', cx, cy, 0 )
//теперь нужно создать итем. Используем стандарт. способность предмета "наведение порчи".
//Дело в том, что эта способность используется только в предмете
if addBlight then //если нужно добавить порчу, создаем итем наводящий порчу
call UnitAddItemByIdSwapped( 'spsh', dummy )
else
call UnitAddItemByIdSwapped( 'pmna', dummy )
endif
call UnitUseItemPoint( dummy, bj_lastCreatedItem, cx0, cy0 )
//Для устранения утечки (остается не удаленным юнит и предмет) можно использовать таймеры
//для удаления использовал триггер DeathDummy
endfunction
//круги с маленьким радиусом мало будут похожи на круг
function SetBlightCircle takes player whichPlayer, real cx, real cy, real radius, boolean addBlight returns nothing
local real Rad = RealRadius128(radius)
local real minx = cx-Rad
local real maxx = cx+Rad
local real miny = cy-Rad
local real maxy = cy+Rad
//начинаем с правого верхнего края
local real x0 = minx
local real y0 = maxy
//центр крайнего правого-верхнего квадратика
local real cx0 = minx+64.0
local real cy0 = maxy-64.0
loop
exitwhen cx0>maxx
set cy0 = maxy-64.0
loop
exitwhen cy0<miny
call MoveRectTo(udg_Rect_32x32[4],cx0,cy0)
if RectContainsCircle(udg_Rect_32x32[4], cx,cy, radius)then //если крайние точки и центр квадрата попадают в круг, начит
//call BJDebugMsg("Проверка прошла")
//call SetBlightPoint(whichPlayer, cx0, cy0, addBlight)
call DummyCastPointBlight(whichPlayer, cx, cy, cx0, cy0, addBlight)
else
//call BJDebugMsg("Проверка не прошла")
endif
set cy0 = cy0-128.0
endloop
set cx0 = cx0 + 128.0
endloop
//call BJDebugMsg("Проверка")
endfunction
//для того, чтобы цель находилась в центре rect. вам нужен другой алгоритм. у меня код начинает с краю от цели
function SetBlightRectangle takes player whichPlayer, rect R, boolean addBlight returns nothing
//local real centx = GetRectCenterX(R)
//local real centy = GetRectCenterY(R)
local real maxx = RealCoord128(GetRectMaxX(R))
local real minx = RealCoord128(GetRectMinX(R))
local real maxy = RealCoord128(GetRectMaxY(R))
local real miny = RealCoord128(GetRectMinY(R))
//начинаем с правого верхнего края
local real x0 = minx
local real y0 = maxy
//центр крайнего правого-верхнего квадратика
local real cx0 = minx+64.0
local real cy0 = maxy-64.0
loop
exitwhen cx0>maxx
set cy0 = maxy-64.0
loop
exitwhen cy0<miny
//call SetBlightPoint(whichPlayer, cx0, cy0, addBlight)
call DummyCastPointBlight(whichPlayer, cx0, cy0, cx0, cy0, addBlight)
set cy0 = cy0-128.0
endloop
set cx0 = cx0 + 128.0
endloop
endfunction
кастует точечно, тк если брать размеры абилы больше 128, то начинает просто кастовать круг
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован MpW
плюс у триггерных нативок еще смещение от заданной оси, поэтому я всегда юзал dummy-cast предмета нежити, которая наводит порчи. она более точная.
Отредактирован MpW
циклами шагами каждую точку проверяем, как и с ректами, тут проверяем так:
расстояние между point и центром круга > R круга, значит вышел за круг.
напоминает пиксельную графику