Jump to content

[Решено] dxDraw и разные разрешения экрана


Recommended Posts

Хочу сделать так, как показано на скриншоте (полупрозрачный прямоугольник 'dxDrawRectangle' вокруг healthbar'a и speedbar'a, и, индикатор скорости и денег 'dxDrawText'), только, чтобы при любом разрешении всё было одинаково. Проблема в последнем.

Скриншот

Альтернативная ссылка на скриншот

Edited by Guest
Link to comment

На самом деле это несложно сделать, просто надо всё последовательно писать. Поставь Rectangle перед жизнями, а остально без разницы. По поводу координат и размеров, отталкивайся от того как считаются координаты и размеры тех же жизней и скорости.

Link to comment

проблема в том, что я понятия не имею как считаются координаты и размеры этих баров (жизни, скорость), т.к. это стандартные бары, которые прорисовываются ресурсом Race. Там пытался рыться, но не разобрался. Разгадка где-то в fancyprogress.lua, race_client.lua, а также возможно и в util_client.lua

Может быть проще самому бары эти сделать, хех...

Link to comment

Это точно в race_client.lua. Напишите название сервера, где вы это видели. Может и ничего писать не придётся, а так, если что завтра напишу и скину код.

Link to comment
 g_ScreenWidth, g_ScreenHeight = guiGetScreenSize() 
dxDrawRectangle(g_ScreenWidth/1.175390266299357, g_ScreenHeight/18.61818181818182, 130, 120, tocolor(0, 0, 0, 150), false) 

да вот это хотя бы отцентрировать, а с текстом разберусь по аналогии. Это для разрешения 1280х1024.

Начитался всякого. Пробовал переводить и в абсолютные координаты и в относительные, но что-то безуспешно. А задача то простая вроде бы

Link to comment

Посмотрел стандартный ресурс. Он был сделан задолго до функции dxSetAspectRatioAdjustmentEnabled и там под каждое разрешение высчитывается свои координаты при помощи функции resAdjust в util_client.lua.

Проще такое же перерисовать самому при помощи dxSetAspectRatioAdjustmentEnabled

Link to comment

Сделал, должно работать как надо. Делал, используя вычисления на основе resAdjust и fancyProgress. Подгонял под стандартный hud race мода.

img.jpg

Client:

local w, h = guiGetScreenSize () 
  
local font = "bankgothic" 
local scale = 0.6 
local textHeight = dxGetFontHeight ( scale, font ) 
local xVel = -67 
local yVel = 125 
local offShading = 4 
local offsetShadings = { {offShading,0},{-offShading,0},{0,offShading},{0,-offShading},{offShading,offShading},{offShading,-offShading},{-offShading,offShading},{-offShading,-offShading} } 
  
local wRec = 130 
local hRec = 120 
local xRec = -62 
local yRec = 56 
  
local xMon = -67 
local yMon = 150 
  
addEventHandler( "onClientResourceStart", getRootElement( ), 
function () 
   if w < 1280 and h < 1024 then 
      wRec = math.floor(wRec*w/1280) 
      hRec = math.floor(hRec*w/1280) 
      xRec = math.floor(xRec*w/1280) 
      yRec = math.floor(yRec*w/1280) 
      xVel = math.floor(xVel*w/1280) 
      yVel = math.floor(yVel*w/1280) 
      xMon = math.floor(xMon*w/1280) 
      yMon = math.floor(yMon*w/1280) 
   end  
   if ( xRec < 0 )then 
         xRec = w - wRec + xRec 
   end 
   if ( yRec < 0 )then 
         yRec = h - hRec + yRec 
   end 
end) 
    
function client_render () 
    local v = getPedOccupiedVehicle ( getLocalPlayer() ) 
    if v then 
        dxDrawRectangle(xRec, yRec, wRec, hRec, tocolor(0, 0, 0, 150), false) 
  
        local PlayerMoney = getElementData ( getLocalPlayer(), "Money" ) 
        local MonTextWidth = dxGetTextWidth ( "$"..PlayerMoney, scale, font ) 
        local xMon2 = w - MonTextWidth + xMon 
        for i, shading in pairs ( offsetShadings ) do 
                        dxDrawText ( "$"..PlayerMoney, xMon2+shading[1], yMon+shading[2], xMon2+MonTextWidth, yMon+textHeight, tocolor(0,0,0,255), scale, font, "center", "center" ) 
                end 
        dxDrawText ( "$"..PlayerMoney, xMon2, yMon, xMon2+MonTextWidth, yMon+textHeight, tocolor(0,255,0,255), scale, font, "center", "center" ) 
  
        local vx, vy, vz = getElementVelocity ( v ) 
        local speed = 1.23 * ( vx^2 + vy^2 + vz^2 ) ^ ( 0.5 ) 
        if speed > 2 then speed = 2 end 
        local rotation = 0 
        if speed > 0 then rotation = 90 / 1.875 * speed end 
        local origspeed = tostring ( math.floor( ( 90 / 1.875 * ( 1.21827411 * ( vx^2 + vy^2 + vz^2 ) ^ ( 0.5 ) ) ) / 90 * 300 + 0.5 ) ) .. " km/h" 
        local textWidth = dxGetTextWidth ( origspeed, scale, font ) 
        local x = w - textWidth + xVel 
        for i, shading in pairs ( offsetShadings ) do 
            dxDrawText ( tostring(origspeed), x+shading[1], yVel+shading[2], x+textWidth, yVel+textHeight, tocolor(0,0,0,255), scale, font, "center", "center" ) 
        end 
        dxDrawText ( tostring(origspeed), x, yVel, x+textWidth, yVel+textHeight, tocolor(0,100,255,255), scale, font, "center", "center" ) 
    end 
end 
addEventHandler("onClientRender", getRootElement(), client_render ) 
  

Server (Сохраняет деньги через дату):

function updatePlayersMoney ( ) 
    for index, player in ipairs ( getElementsByType "player" ) do 
        setElementData ( player, "Money", getPlayerMoney ( player ) ) 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), updatePlayersMoney ) 
setTimer ( updatePlayersMoney, 2500, 0 ) 

Link to comment

Подправил, 19 строка, второй аргумент:

local w, h = guiGetScreenSize () 
  
local font = "bankgothic" 
local scale = 0.6 
local textHeight = dxGetFontHeight ( scale, font ) 
local xVel = -67 
local yVel = 125 
local offShading = 4 
local offsetShadings = { {offShading,0},{-offShading,0},{0,offShading},{0,-offShading},{offShading,offShading},{offShading,-offShading},{-offShading,offShading},{-offShading,-offShading} } 
  
local wRec = 130 
local hRec = 120 
local xRec = -62 
local yRec = 56 
  
local xMon = -67 
local yMon = 150 
  
addEventHandler( "onClientResourceStart", resourceRoot, 
function () 
   if w < 1280 and h < 1024 then 
      wRec = math.floor(wRec*w/1280) 
      hRec = math.floor(hRec*w/1280) 
      xRec = math.floor(xRec*w/1280) 
      yRec = math.floor(yRec*w/1280) 
      xVel = math.floor(xVel*w/1280) 
      yVel = math.floor(yVel*w/1280) 
      xMon = math.floor(xMon*w/1280) 
      yMon = math.floor(yMon*w/1280) 
   end  
   if ( xRec < 0 )then 
         xRec = w - wRec + xRec 
   end 
   if ( yRec < 0 )then 
         yRec = h - hRec + yRec 
   end 
end) 
    
function client_render () 
    local v = getPedOccupiedVehicle ( getLocalPlayer() ) 
    if v then 
        dxDrawRectangle(xRec, yRec, wRec, hRec, tocolor(0, 0, 0, 150), false) 
  
        local PlayerMoney = getElementData ( getLocalPlayer(), "Money" ) 
        local MonTextWidth = dxGetTextWidth ( "$"..PlayerMoney, scale, font ) 
        local xMon2 = w - MonTextWidth + xMon 
        for i, shading in pairs ( offsetShadings ) do 
                        dxDrawText ( "$"..PlayerMoney, xMon2+shading[1], yMon+shading[2], xMon2+MonTextWidth, yMon+textHeight, tocolor(0,0,0,255), scale, font, "center", "center" ) 
                end 
        dxDrawText ( "$"..PlayerMoney, xMon2, yMon, xMon2+MonTextWidth, yMon+textHeight, tocolor(0,255,0,255), scale, font, "center", "center" ) 
  
        local vx, vy, vz = getElementVelocity ( v ) 
        local speed = 1.23 * ( vx^2 + vy^2 + vz^2 ) ^ ( 0.5 ) 
        if speed > 2 then speed = 2 end 
        local rotation = 0 
        if speed > 0 then rotation = 90 / 1.875 * speed end 
        local origspeed = tostring ( math.floor( ( 90 / 1.875 * ( 1.21827411 * ( vx^2 + vy^2 + vz^2 ) ^ ( 0.5 ) ) ) / 90 * 300 + 0.5 ) ) .. " km/h" 
        local textWidth = dxGetTextWidth ( origspeed, scale, font ) 
        local x = w - textWidth + xVel 
        for i, shading in pairs ( offsetShadings ) do 
            dxDrawText ( tostring(origspeed), x+shading[1], yVel+shading[2], x+textWidth, yVel+textHeight, tocolor(0,0,0,255), scale, font, "center", "center" ) 
        end 
        dxDrawText ( tostring(origspeed), x, yVel, x+textWidth, yVel+textHeight, tocolor(0,100,255,255), scale, font, "center", "center" ) 
    end 
end 
addEventHandler("onClientRender", getRootElement(), client_render ) 
  

Иначе будет сдвигаться после каждого запуска левых ресурсов/карт

Link to comment

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...