JASS, Reforged
Итак я понял как делать высоту, я понял что такое GetTerrainZ и как она работает.
Итак я понял как делать высоту, я понял что такое GetTerrainZ и как она работает.
Итак смысл такой, мне нужно "просканировать" всю жёлтую область ( ореинтируясь от центра , т.е точку моей Ability Target Point)
и сделать так что бы все эффекты которые появятся были на высоте " допустим 100 + максимальная высота рельефа которая присутствует в жёлтой области"
Доходит туго, прошу поподробнее.
и сделать так что бы все эффекты которые появятся были на высоте " допустим 100 + максимальная высота рельефа которая присутствует в жёлтой области"
Доходит туго, прошу поподробнее.
Принятый ответ
EviLInside, шаг меньше можно, только это увеличит работу цикла. Обычно шаг 32 используется для задачи мин клетке 32х32 тип паффинга, это я к примеру говорю что у варика сетка. даже ректы и регионы используют. А как высота строится, не знаю, сеточно ли? помню мне один пользователь Ральз скидывал на хайв xgm.guru/p/100/201676 А если у вас окружность огромная, то это сколько работы. можешь выложить в алгоритмы
код
library TerrainHeight
globals
private location loc = Location(0, 0)
real XH
real YH
endglobals
function GetTerrainZ takes real x, real y returns real
call MoveLocation(loc, x, y)
return GetLocationZ(loc)
endfunction
function IsCoordsInCircle takes real x,real y,real rad,real cx,real cy returns boolean
return (cx-x)*(cx-x)+(cy-y)*(cy-y)<rad*rad
endfunction
//Возвращает макс высоту в круге (а координаты в глобалках XH,YH)
function GetTerrainMaxZinRadius real cx, real cy, real rad returns real
local real maxH = GetTerrainZ(cx,cy)
//вершины квадрата
local real minx = cx-rad
local real miny = cy-rad
local real maxx = cx+rad
local real maxy = cy+rad
//координаты смещения
local real x = minx
local real y = miny
//мин шаг
local real block = 32.00
//инициирует координаты
set XH=cx
set YH=cy
loop
exitwhen y>maxy
set x = minx
loop
exitwhen x>maxx
if IsCoordsInCircle(x,y,rad,cx,cy) then
//если высота меньше, то записывает в maxH
if maxH < GetTerrainZ(x,y) then
set maxH = GetTerrainZ(x,y)
set XH = x
set YH = y
endif
endif
set x = x + block
endloop
set y = y + block
endloop
return maxH
endfunction
endlibrary
код писал от руки, тк редактора не было. ошибки не должно быть,
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Берги
И тогда можно будет заюзать, то что я скидывал
call BlzSetSpecialEffectHeight( Leffect, GetLocationZ(Ltargetpoint) +100) передать высоту смещённой точки Ltargetpoint
Отредактирован MpW
1 берете заводите темп глобалку maxH, и координаты XH YH. в ней записываете высоту центра окружности и координаты XH YH
2 Можно взять квадрат, который вписан в окружность. или правильно сказать окружность вписанная в квадрат. путаю эти понятия. далее циклом пробегаете по каждой точке квадрата. и сравниваете размер высоты с maxH.
Цикл происходит так (описываю примерно): сначала от левого верхнего угла квадрата берем точку, и проверяем
2.1 лежит ли точка в окружности, это надо сравнить: расстояние этой точки от центра окружности <= radius круга. Если меньше значит попала точка, иначе если больше расстояние, значит точка не лежит в круге (значит лежит уголке квадрата), следовательно, высоту не имеет смысла проверять.
2.2 проверяем высоту. сравниваем высоту выбранной точки, если оно больше чем maxH, значит берем эту высоту и записываем в maxH и координаты этой точки в XH YH
И тут самое интересное мои познания функций существующих для совершения некоторых действий которые описаны - очень скудные, да и правильность их использования что бы не через задний проход структурировался код и кучей лишних действий. Поэтому если не сложно и у кого то есть времени немного, сделайте на примере любой аое абилке.
function GetTerrainMaxZinRadius takes "точка" , takes "радиус окружности от этой точки" return "МаксВысота в этом радиусе от точки"
И выложить её в статьях, кому то да пригодится возможно...Эх мечты.
Отредактирован MpW