Jump to content

Dibujar un rectángulo según la longitud de un texto


aka Blue

Recommended Posts

Bueno, como dice el título, estoy realizando unos pequeños cambios y lo que quiero hacer es crear nametags encima de la cabeza del jugador pero que los mismos tengan un rectángulo que se vaya poniendo más grande o más pequeño según la longitud del nombre con la función DxGetTextWidth. ¿Cómo podría hacerlo? Actualmente tengo ésto:

local font = dxCreateFont( "Lato.ttf" )

addEventHandler ( "onClientRender", root,
function()
	local playersTable = getElementsByType( 'player' )
	for i=1, #playersTable do
		local p = playersTable[ i ] -- Get the player
		--if isLoggedIn( p ) then
			local px, py, pz = getElementPosition( p ) -- Get the position
			local cx, cy, cz = getCameraMatrix( ) -- Get the camera matrix
			local min_distance = getDistanceBetweenPoints3D( cx, cy, cz, px, py, pz ) -- Get the min distance between 3D points
			if min_distance < 15 then
				if isLineOfSightClear( cx, cy, cz, px, py, pz, true, false, false, true, false, false, false, localPlayer ) then
					local bx, by, bz = getPedBonePosition( p, 5 )
					local x,y = getScreenFromWorldPosition( bx, by, bz + 0.3 )
					if x and y then
						dxDrawRectangle( x-54, y-10, x/5, y/15, tocolor(0, 0, 0, 30) )
						dxDrawText( "[Player] "..getPlayerName( p ), x-10, y+2, x, y, tocolor(0, 0, 0), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
						dxDrawText( "[#800000Player#ffffff] "..getPlayerName( p ), x-10, y, x, y, tocolor(255, 255, 255), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
					end
				end
			end
		--end
	end
end)

Cómo se ve:

J6tiZKv.png

Link to comment
1 hour ago, aka Blue said:

Bueno, como dice el título, estoy realizando unos pequeños cambios y lo que quiero hacer es crear nametags encima de la cabeza del jugador pero que los mismos tengan un rectángulo que se vaya poniendo más grande o más pequeño según la longitud del nombre con la función DxGetTextWidth. ¿Cómo podría hacerlo? Actualmente tengo ésto:


local font = dxCreateFont( "Lato.ttf" )

addEventHandler ( "onClientRender", root,
function()
	local playersTable = getElementsByType( 'player' )
	for i=1, #playersTable do
		local p = playersTable[ i ] -- Get the player
		--if isLoggedIn( p ) then
			local px, py, pz = getElementPosition( p ) -- Get the position
			local cx, cy, cz = getCameraMatrix( ) -- Get the camera matrix
			local min_distance = getDistanceBetweenPoints3D( cx, cy, cz, px, py, pz ) -- Get the min distance between 3D points
			if min_distance < 15 then
				if isLineOfSightClear( cx, cy, cz, px, py, pz, true, false, false, true, false, false, false, localPlayer ) then
					local bx, by, bz = getPedBonePosition( p, 5 )
					local x,y = getScreenFromWorldPosition( bx, by, bz + 0.3 )
					if x and y then
						dxDrawRectangle( x-54, y-10, x/5, y/15, tocolor(0, 0, 0, 30) )
						dxDrawText( "[Player] "..getPlayerName( p ), x-10, y+2, x, y, tocolor(0, 0, 0), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
						dxDrawText( "[#800000Player#ffffff] "..getPlayerName( p ), x-10, y, x, y, tocolor(255, 255, 255), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
					end
				end
			end
		--end
	end
end)

Cómo se ve:

J6tiZKv.png

En X y el ancho del rectangulo le vas a sumar lo que hiciste en el tamaño del texto y en el ancho lo contrario.

Link to comment
local textWidth = dxGetTextWidth( "[#800000Player#ffffff] "..getPlayerName( p ) ,  0.85 + ( 15 - min_distance ) * 0.03 , font)

Y textWidth sería el ancho del rectángulo si lo quieres super apretado, puedes agregarle unas unidades más al texto y luego con la bounding box centrarlo.

 

BTW, sería mejor que guardases el texto en una variable así no hay que obtener el nombre varias veces, es más eficiente.

Link to comment

Lo hice pero sigue dando problemas. Se mueve hacia la derecha y pues el texto queda algo fuera :c

local font = dxCreateFont( "Lato.ttf" )

addEventHandler ( "onClientRender", root,
function()
	local playersTable = getElementsByType( 'player' )
	for i=1, #playersTable do
		local p = playersTable[ i ] -- Get the player
		--if isLoggedIn( p ) then
			local name = getPlayerName( p )
			local px, py, pz = getElementPosition( p ) -- Get the position
			local cx, cy, cz = getCameraMatrix( ) -- Get the camera matrix
			local min_distance = getDistanceBetweenPoints3D( cx, cy, cz, px, py, pz ) -- Get the min distance between 3D points
			if min_distance < 15 then
				if isLineOfSightClear( cx, cy, cz, px, py, pz, true, false, false, true, false, false, false, localPlayer ) then
					local bx, by, bz = getPedBonePosition( p, 5 )
					local x,y = getScreenFromWorldPosition( bx, by, bz + 0.3 )
					local textWidth = dxGetTextWidth( name,  0.85 + ( 15 - min_distance ) * 0.03 , font)
					if x and y then
						dxDrawRectangle( x-54, y-10, textWidth+15, y/15, tocolor(0, 0, 0, 30) )
						dxDrawText( name, x-10, y+2, x, y, tocolor(0, 0, 0), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
						dxDrawText( name, x-10, y, x, y, tocolor(255, 255, 255), 0.85 + ( 15 - min_distance ) * 0.03, font, "center", "center", false, false, false, true )
					end
				end
			end
		--end
	end
end)

 

Link to comment

Usa la misma posición y ancho para el rectángulo y para el texto entonces centras el texto.

Usa la misma posición y ancho para el rectángulo y para el texto entonces centras el texto.

Usa la misma posición y ancho para el rectángulo y para el texto entonces centras el texto.

Link to comment

Eso hago pero sigue apareciendo mal. Mi duda es, ¿qué hago? ¿lo sumo, lo resto, lo divido, lo multiplico? Porque las posiciones que hay puestas son las "buenas" que digamos, mas bien, las que tienen que quedar al final.

Eso hago pero sigue apareciendo mal. Mi duda es, ¿qué hago? ¿lo sumo, lo resto, lo divido, lo multiplico? Porque las posiciones que hay puestas son las "buenas" que digamos, mas bien, las que tienen que quedar al final.

Eso hago pero sigue apareciendo mal. Mi duda es, ¿qué hago? ¿lo sumo, lo resto, lo divido, lo multiplico? Porque las posiciones que hay puestas son las "buenas" que digamos, mas bien, las que tienen que quedar al final.

Link to comment
  • Recently Browsing   0 members

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