Как отследить в какой части миникарты находится точка

Содержание:
Кратко: вы можете приказом тыкнуть по мини-карте. И как понятно, что если юнитом кликнуть таргетом по миникарте, то юнит туда пойдет. А еще можно найти очереди. Для чего это я вам пишу? Ну знаете, можно прикрепить на мини-карте всякие иконки, и спрайты
ссылка 1 <= тут не правильно спрайты на мини-карте лежат
ниже на гифке неправильно создаются спрайте на мини-карте. на мини-карте создаются не там, где нужна.
» пояснения
У нас существует мини-карта (все размеры и координаты выдрал из fdf-file):
--размеры мини-карты 
MiniMap_Width = BlzFrameGetWidth(BlzGetOriginFrame ( ORIGIN_FRAME_MINIMAP , 0 )) --0.139375
MiniMap_Height = BlzFrameGetHeight(BlzGetOriginFrame ( ORIGIN_FRAME_MINIMAP , 0 )) --0.138125
--соотношение сторон мини-карты
AspectRatio_MiniMap=MiniMap_Width/MiniMap_Height=1.009049774

--точка отсчета мини-карты (0,0) pos framepoint_bottomleft миникарты
MiniMap_x0=0.009375
MiniMap_y0=0.006875

--центр мини-карты pos framepoint_center миникарты
MiniMap_cx=MiniMap_x0+(MiniMap_Width/2)
MiniMap_cy=MiniMap_y0+(MiniMap_Height/2)
игровая карта или границы камеры. Я еще до сих пор не знаю, что лучше. Начинал с границ камер bj_mapInitialCameraBounds, там столько ошибок было изначально в системе. Решил попробовать игровую карту bj_mapInitialPlayableArea. Это не значит, что границы камеры хуже. Но пока не знаю. Но в редакторе границы камеры не в 1:1, когда мне надо были размеры в 1:1. Сейчас я решил эту проблему.
--размеры границ камеры bj_mapInitialPlayableArea
PlayableArea_Width = GetRectWidthBJ(bj_mapInitialPlayableArea)
PlayableArea_Height = GetRectHeightBJ(bj_mapInitialPlayableArea)
--соотношение размеров игровой карты
AspectRatio_PlayableArea=PlayableArea_Width/PlayableArea_Height
игровая карта может быть разных соотношении
игровая карта соотношение 1.08:1
w=6912 (54)
h=6400 (50)
AspectRatio_PlayableArea=w/h=1.08
игровая карта соотношение 0.92:1
w=6400 (50)
h=6912 (54)
AspectRatio_PlayableArea=w/h=0.92
игровая карта соотношение 1:1
w = 6656 (52)
h = 6656 (52)
AspectRatio_PlayableArea=w/h=1
теоретически размер мини-карты не изменяется, он остается таким же. Но обрезается границами, если расширяется или сужается размерами. BlzFrameGetWidth(frame) и BlzFrameGetHeight(frame) не показывают изменении, а значит от размеров фреймов не зависят. Но зависимость идет от размеров карты. ниже код, но в некоторых моментах работает с погрешностями при растягивании размеров границ. Пример соотношения 1:1, 1.08:1 работает ниже, а 0.92:1 с погрешностями, ладно лень уже
--игровая карта становится шире, а значит, и положение точки отсчета меняет тоже.
if AspectRatio_PlayableArea > 1.00 then
	new_h=MiniMap_Height/AspectRatio_PlayableArea=0.138125/1.08=0.12789
 	MiniMap_y0=MiniMap_y0+( (MiniMap_Height-new_h)/2 )=0.006875+(0.138125-0.12789)/2=0.006875+0.0051175=0.0119925
 	
	MiniMap_Height = new_h
	
	--Если хотите двигать центр фрейма framepoint_center то умножить лучше на 2.5. Как-то случайно нашел коэффициент. Потом понял, что он не нужен, тк я попутал framepoint_center с framepoint_bottomleft.
	--умножаем тело отсчета на 2.5
	--MiniMap_x0=MiniMap_x0*2.5
	--MiniMap_y0=MiniMap_y0*2.5
	
--игровая карта становится растянутой, а значит, и точка отсчета меняет положение. Тут просто размеры поменяли.
elseif AspectRatio_PlayableArea < 1.00 then
	new_w=MiniMap_Width*AspectRatio_PlayableArea=0.139375*0.92=0.128225
	MiniMap_x0=MiniMap_x0+( (MiniMap_Width-new_w)/2 )=0.009375+(0.139375-0.128225)/2=0.009375+0.00893568=0.018
	MiniMap_Width = new_w
	
	--Если хотите двигать центр фрейма framepoint_center то умножить лучше на 2.5. Как-то случайно нашел коэффициент. Потом понял, что он не нужен, тк я попутал framepoint_center с framepoint_bottomleft.
	--умножаем тело отсчета на 2.5
	--MiniMap_x0=MiniMap_x0*2.5
	--MiniMap_y0=MiniMap_y0*2.5
	
--если соотношение игровой карты 1:1, то точку отсчета не нужно менять
elseif PlayableArea_Width == PlayableArea_Height then
	--умножаем тело отсчета на 2.5
	--MiniMap_x0=MiniMap_x0*2.5
	--MiniMap_y0=MiniMap_y0*2.5
end
оффсеты. тут есть небольшие отклонения. и они зависят от соотношения размеров миникарты.
» раскрыть
if AspectRatio_MiniMap > 1.00 then
offsetx = 0.00
offsety = MiniMap_x0 / AspectRatio_MiniMap = 0.009375 / 1.009049774 = 0.009
elseif AspectRatio_MiniMap < 1.00 then
offsetx = MiniMap_y0 * AspectRatio_MiniMap = 0.006875 * 1.009049774 = 0.0069
offsety = 0.00
end
ну и код определения положения спрайта. Вводим мировые координаты, получаем экранные координаты. Точнее координаты миникарты
function GetScreenPosAtMiniMap(x,y)
    local procent_X = (((PlayableArea_Width/2)+x)/PlayableArea_Width) --*100.00
    local procent_Y = (((PlayableArea_Height/2)+y)/PlayableArea_Height) --*100.00

    local ScreenX = (procent_X*MiniMap_Width) --/100.00
    local ScreenY = (procent_Y*MiniMap_Height) --/100.00
    print(ScreenX..","..ScreenY)
                  
    return (ScreenX),(ScreenY)
end

--пример вызова-создаем фрейм
QueueOrders.WayPointAtMiniMap[h][NumberOrder] = BlzCreateFrameByType("SPRITE", "MinimapWaypoint", gameUI, "MinimapWaypoint", 0)
local Sx, Sy = GetScreenPosAtMiniMap(GetOrderPointX(),GetOrderPointY())
BlzFrameSetAbsPoint(QueueOrders.WayPointAtMiniMap[h][NumberOrder], FRAMEPOINT_BOTTOMLEFT, MiniMap_x0+Sx, MiniMap_y0+Sy)							
вот сама карта <= система добавления приказов в очередь. пока сырая. много чего дорабатывать надо. Суть в чем? когда мы выбираем мышью с помощью прицела цель, жмем на кнопку мыши. Тут нужно сбить очередь. Юнит получает приказ стоп при клике кнопки мыши, и тут же системой получает приказ следовать новому приказу. Новый запоминаем, и выполняем старый.
ссылка 2 <= тут все объяснено. и карта
тут вся суть в том, что границы игровой карты или границы камеры могут быть не в 1:1. Вы можете в редакторе карты сузить границами камеры.


Views: 25

There are no comments yet