Sergey_Walter Posted April 6, 2014 Share Posted April 6, 2014 Всем привет, помогите доработать прямоугольный радар.. нужно чтоб значок севера двигался по прямоугольнику при повороте камеры, в принципе и не это главное, хочется чтоб например иконки стримились и оставались на краю радара как и в оригинальном радаре. В CLEO это уже реализовали http://gtaforums.com/topic/569955-gta-sa-rectangular-hud, к сожалению я немогу декомпилировать radarrect.asi и посмотреть алгоритм работы кода, нашёл тока наработки http://pastebin.com/UvaU1wBv. Полазив по форуму заметил что этим уже интересовались. https://forum.multitheftauto.com/viewtopic.php?f=91&t=73583&hilit=radar+blip https://forum.multitheftauto.com/viewtopic.php?f=91&t=71784 Думаю там нужно высчитывать квадратный корень, но я с функциями вроде "sqrt"ами,atan2"ами,radian"ами,math.max"ами и math.min"ами,vector"ами не дружу( Вот код: local s = {guiGetScreenSize()} local icons = {} for k = 1,65 do icons[k] = dxCreateTexture("blips/"..k..".png") end local blips = {} addEventHandler( "onClientResourceStart", getRootElement( ),function (res) if res ~= getThisResource() then return end radarTexture = dxCreateTexture("map.png") currentZoomState = 1 local width, height = 1200,1200 radar = dxCreateRenderTarget( s[1]*width*3/s[1], s[2]*height*3/s[2] ) mapRadar = dxCreateRenderTarget( s[1]*width*3/s[1], s[2]*height*3/s[2],true ) radararea = dxCreateRenderTarget( s[1]*width*3/s[1], s[2]*height*3/s[2],true ) pathmap = dxCreateRenderTarget( s[1]*width*3/s[1], s[2]*height*3/s[2],true ) local MimgW,MimgH = dxGetMaterialSize(mapRadar) setTimer(function () blips = {} for i, v in ipairs( getElementsByType('blip') ) do local icon = getBlipIcon(v) if icon > 3 then local px,py = getElementPosition(v) local blip_x = (3000+px)/6000*MimgW local blip_y = (3000-py)/6000*MimgH local rot = getPedCameraRotation( localPlayer ) table.insert(blips,{x = blip_x, y = blip_y,icon = icon}) end end end,1000,0) addEventHandler ("onClientHUDRender",root, function () local rot = getPedCameraRotation( localPlayer ) if getElementData(getLocalPlayer(), "loggedin") == 1 then dxSetRenderTarget( mapRadar,true ) dxDrawImage (0,0,MimgW,MimgH, radarTexture) for i, v in ipairs( blips ) do dxDrawImage(v.x-20/2, v.y-20/2, 20 + currentZoomState * 22, 20 + currentZoomState * 22,icons[v.icon],rot) end --[[for i, v in ipairs(getElementsByType('player') ) do if v ~= localPlayer then local r,g,b = 20,200,20 or getPlayerNametagColor(v) local px,py = getElementPosition(v) local p_x = (3000+px)/6000*MimgW local p_y = (3000-py)/6000*MimgH local prot = getPedRotation( v ) local p_blipsize = 20-currentZoomState dxDrawImage (p_x-p_blipsize/2,p_y-p_blipsize/2,p_blipsize,p_blipsize, icons[3],-prot,0,0,tocolor(r,g,b)) end end]] dxSetRenderTarget( ) dxSetRenderTarget( radararea,true ) for i, v in ipairs( getElementsByType('radararea') ) do local r,g,b,a = getRadarAreaColor(v) local w,h = getRadarAreaSize(v) x,y = getElementPosition(v) x = x / (6000 / MimgW) + MimgW/2 y = y / (-6000/ MimgH) + MimgH/2 dxDrawRectangle(x, (y-h) + (h/2), (w/1.66), (h/1.66), tocolor(r,g,b,a)) end dxSetRenderTarget( ) dxSetRenderTarget( radar,true ) local x,y,z = getElementPosition(localPlayer) local mapx = x / (6000/MimgW) + MimgW/2 - width*currentZoomState/2 local mapy = y / (-6000/MimgH) + MimgH/2 - height*currentZoomState/2 dxDrawImageSection (0,0,width,height,mapx,mapy,width*currentZoomState,height*currentZoomState,mapRadar,-rot) dxDrawImageSection (0,0,width,height,mapx,mapy,width*currentZoomState,height*currentZoomState,radararea,-rot) dxDrawImageSection (0,0,width,height,mapx,mapy,width*currentZoomState,height*currentZoomState,pathmap,-rot) local px,py = getElementPosition(localPlayer) local prot = getPedRotation( localPlayer ) local pblipsize = 32 - currentZoomState dxDrawImage (width/2-pblipsize/2,height/2-pblipsize/2,pblipsize,pblipsize, icons[3],-rot-prot) dxSetRenderTarget() dxDrawImageSection(s[1]/22.6, s[2]/1.426, 306, 206, 455,505, 290, 190,radar, 0, -90, 0, tocolor(255, 255, 255, 255),true) dxDrawImage(s[1]/24.7, s[2]/1.44, 320, 220, "hud.png") --if rot >= 0 and rot <= 120 then --dxDrawImageSection(s[1]/3.45-(rot*2.95),s[2]/1.46, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) --elseif rot >= 120 and rot <= 180 then --dxDrawImageSection(64,126+rot*4.82*1.06, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) --elseif rot >= 180 and rot <= 300 then --dxDrawImageSection(rot*2.422,680, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) --elseif rot >= 300 and rot <= 360 then --dxDrawImageSection(728,1540-rot*2.92, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) --end vehicle = getPedOccupiedVehicle(getLocalPlayer()) if vehicle and getVehicleSpeed() > 20 and getVehicleSpeed() < 120 then currentZoomState = 0.8 + getVehicleSpeed() / 100 end end end) end) function getVehicleSpeed() local vx, vy, vz = getElementVelocity(vehicle) return math.sqrt(vx^2 + vy^2 + vz^2) * 161 end Пробовал самый примитивный код, но иконка севера на других разрешениях экрана бегала уже в других местах экрана) if rot >= 0 and rot <= 120 then dxDrawImageSection(s[1]/3.45-(rot*2.95),s[2]/1.46, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) elseif rot >= 120 and rot <= 180 then dxDrawImageSection(64,126+rot*4.82*1.06, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) elseif rot >= 180 and rot <= 300 then dxDrawImageSection(rot*2.422,680, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) elseif rot >= 300 and rot <= 360 then dxDrawImageSection(728,1540-rot*2.92, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) end Кому интересно и хочет помочь, вот ссылка на скрипт с файлами http://rghost.ru/53816059 Код конечно не мой, я его просто дорабатываю для себя. Link to comment
SDraw Posted April 6, 2014 Share Posted April 6, 2014 Код довольно примитивный должен выходить, дам толчок Link to comment
Sergey_Walter Posted April 6, 2014 Author Share Posted April 6, 2014 (edited) Код довольно примитивный должен выходить, дам толчок Слушай, а у тебя фантазия работает, спасибо за идею! Тока мне кажется что это нелегко реализовать, я как понял нужно соединить две точки, чтоб зеленая при повороте камеры ходила по окружности от центра, а красная держалась за край прямоугольника и бегала по полоске. Жаль в школе не дружил с геометрией и завалил колледж по программированию) Давай примерим, круг будет 360° с помощью getPedCameraRotation заставим её бегать по окружности, какой то у меня был код связан с полоской который крутился, а вот он: local s = {guiGetScreenSize()} local rot = getPedCameraRotation( localPlayer ) movingx = s[1] + math.sin(math.rad(-(rot)-500)) * 500 movingy = s[2] + math.cos(math.rad(-(rot)-500)) * 500 dxDrawLine(s[1]/2, s[2]/2, movingx/2, movingy/2, tocolor(255, 0, 0, 255), 2) кароч, начну эксперименты) Edited April 6, 2014 by Guest Link to comment
SDraw Posted April 6, 2014 Share Posted April 6, 2014 Слушай, а у тебя фантазия работаетУ меня просто способность делать велосипеды Link to comment
Sergey_Walter Posted April 6, 2014 Author Share Posted April 6, 2014 ну вот кое что получилось, полоска крутится на 360 градусов, теперь нужно иконку заставить бегать по полоске в прямоугольнике. Использовал следующий код: local s = {guiGetScreenSize()} local rot = getPedCameraRotation( localPlayer ) left = (s[1] - 320) / 2 top = (s[2] - 220) / 2 dxDrawImage(left, top, 320, 220, "hud.png") movingx = s[1] + math.sin(math.rad(rot)) * 370 movingy = s[2] + math.cos(math.rad(rot)) * 370 dxDrawLine(s[1]/2, s[2]/2, movingx/2, movingy/2, tocolor(255, 0, 0, 255), 2) dxDrawImageSection(movingx/2-16,movingy/2-16, 32, 32, 0, 0, 32, 32,icons[4], 0, -90, 0, tocolor(255, 255, 255, 255),true) http://rghost.ru/53827605 Эх нашёлся бы человек который неплохо знает эти функции) http://www.lua.ru/doc/5.6.html Link to comment
Kernell Posted April 7, 2014 Share Posted April 7, 2014 Может я чего-то не понимаю, но помоему просто достаточно ограничить X и Y с помощью Clamp. К примеру вот так: X = Clamp( 0, X, Width ) + RadarPosition.X; Y = Clamp( 0, Y, Height ) + RadarPosition.Y; Т.е. первым делом, тебе нужно преобразовать из мировых координат в экранные, а потом уже применить ротацию, после чего финальный штрих - ограничение экранных координат с помощью Clamp. function Clamp( min, a, max ) return math.max( math.min( a, max ), min ); end P.S. Только у меня BB-код lua не работает? Link to comment
Sergey_Walter Posted April 7, 2014 Author Share Posted April 7, 2014 Про функцию clamp спасибо, я в ней разобрался, и все получилось еще проще) Link to comment
ronaldoguedess Posted July 22, 2014 Share Posted July 22, 2014 можете поделиться, как это было сделано, чтобы исправить? Link to comment
ronaldoguedess Posted September 27, 2014 Share Posted September 27, 2014 ???????????? Link to comment
Fabervox Posted September 28, 2014 Share Posted September 28, 2014 Мне кажется проще всего, просто из углов получать положение в прямоугольной фигуре. Т.е. для квадрата примером, делать проверку в какой четверти(на какой линии) находится, а сам сдвиг на линии относительно угловых точек, вычислять как относительный градус*сторона/180/2, для целых градусов. Для прямоугольников чуть сложнее, сначала определяется диапазон углов, как 180/сумма соотношений сторон(т.е. при 3:4, будет 7), а потом полученное значение*соотношение стороны(т.е. полученное значение*3 и полученное значение*4), соответственно уже на это делить длину стороны. Link to comment
iAxel Posted November 10, 2014 Share Posted November 10, 2014 Ребята можете помочь? Попробовал несколько вариантов чтобы отображались иконки но они не отображаются. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now