Jump to content

Recommended Posts

Всем привет, помогите доработать прямоугольный радар..

46abfd9a9508056acaf438643988f3dfcebd67e5.jpg

нужно чтоб значок севера двигался по прямоугольнику при повороте камеры, в принципе и не это главное, хочется чтоб например иконки стримились и оставались на краю радара как и в оригинальном радаре. В 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
Код довольно примитивный должен выходить, дам толчок

6gwtw3.jpg

Слушай, а у тебя фантазия работает, спасибо за идею! Тока мне кажется что это нелегко реализовать, я как понял нужно соединить две точки, чтоб зеленая при повороте камеры ходила по окружности от центра, а красная держалась за край прямоугольника и бегала по полоске. Жаль в школе не дружил с геометрией и завалил колледж по программированию) Давай примерим, круг будет 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 by Guest
Link to comment

163b39d01b20.jpg ну вот кое что получилось, полоска крутится на 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

Может я чего-то не понимаю, но помоему просто достаточно ограничить 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
  • 3 months later...
  • 2 months later...

Мне кажется проще всего, просто из углов получать положение в прямоугольной фигуре.

Т.е. для квадрата примером, делать проверку в какой четверти(на какой линии) находится, а сам сдвиг на линии относительно угловых точек, вычислять как относительный градус*сторона/180/2, для целых градусов.

Для прямоугольников чуть сложнее, сначала определяется диапазон углов, как 180/сумма соотношений сторон(т.е. при 3:4, будет 7), а потом полученное значение*соотношение стороны(т.е. полученное значение*3 и полученное значение*4), соответственно уже на это делить длину стороны.

Link to comment
  • 2 weeks later...
  • 1 month later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...