aka Blue Posted October 6, 2016 Share Posted October 6, 2016 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: Link to comment
Enargy, Posted October 6, 2016 Share Posted October 6, 2016 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: 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
aka Blue Posted October 6, 2016 Author Share Posted October 6, 2016 @Gaberiel No entendí, disculpa xd. Link to comment
Tomas Posted October 6, 2016 Share Posted October 6, 2016 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
aka Blue Posted October 7, 2016 Author Share Posted October 7, 2016 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
Tomas Posted October 7, 2016 Share Posted October 7, 2016 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
aka Blue Posted October 7, 2016 Author Share Posted October 7, 2016 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
Enargy, Posted October 8, 2016 Share Posted October 8, 2016 dxDrawRectangle( x-textWidth, y-10, textWidth * 2, y/15, tocolor(0, 0, 0, 30) ) Link to comment
Recommended Posts