Doongogar Posted March 24, 2023 Posted March 24, 2023 Então estou fazendo esse codigo que cria um texto em todos os objetos do modelo 1491 que é uma porta, no caso o código e pra trancar/destrancar portas, a parte de trancar e destrancar foi bem facil e esta funcionando, porém eu tentei criar o texto com a função útil: dxDrawTextOnElement no entanto eu gostaria de rodar o texto no onClientRender para atualizar caso o jogador tranque/destranque apareça em tempo real se ta trancada ou não mas o texto não esta sendo criado, não apresenta erros, só não cria, gostaria de uma ajuda com isso, também acho que da pra tirar o evento onClientRender e vincular um evento no código de trancar/destrancar para só atualizar quando trancar/destrancar ao invez de frame a frame para deixar mais liso, se puderem ajudar com isso também. Nota: tirei o ultimo argumento da função dxDrawTextOnElement, porque é opcional e eu não estou usando, caso não puder fazer isso avise, mas antes de eu tirar também não estava funcionando. function TextoPortas() for i, portas in ipairs(getElementsByType("object")) do if getElementModel(portas) == 1491 then if isElementFrozen(portas) then dxDrawTextOnElement(portas, "#FF0000[E] #FFFFFFPara Abrir", 0, 0, 5, 255, 255, 255, 255, 1.1, "default-bold") else dxDrawTextOnElement(portas, "#FF0000[E] #FFFFFFPara Fechar", 0, 0, 5, 255, 255, 255, 255, 1.1, "default-bold") end end end end addEventHandler("onClientRender", root, TextoPortas) function dxDrawTextOnElement(TheElement,text,height,distance,R,G,B,alpha,size,font) local x, y, z = getElementPosition(TheElement) local x2, y2, z2 = getCameraMatrix() local distance = distance or 20 local height = height or 1 if (isLineOfSightClear(x, y, z+2, x2, y2, z2)) then local sx, sy = getScreenFromWorldPosition(x, y, z+height) if(sx) and (sy) then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if(distanceBetweenPoints < distance) then dxDrawText(text, sx+2, sy+2, sx, sy, tocolor(R or 255, G or 255, B or 255, alpha or 255), (size or 1)-(distanceBetweenPoints / distance), font or "arial", "center", "center") end end end end
Other Languages Moderators Lord Henry Posted March 25, 2023 Other Languages Moderators Posted March 25, 2023 (edited) Mesmo copiando o código-fonte da função útil dxDrawTextOnElement, você fez questão de mudar a indentação dela para deixar errada, por qual motivo? (todas as variáveis locais tem +4 espaços) O texto não aparece pois está atravessando a porta. A função útil tem uma condição de que o texto só aparece se não tiver nada entre o texto e a câmera. Remova essa condição e o texto sempre aparecerá mesmo estando dentro da porta. Se quer usar código de cores no texto, você precisará fazer um upgrade na função útil para incluir o parâmetro colorCoded no dxDrawText. Tente algo assim: theObj = createObject (1491, 2487, -1666, 12.3) -- Cria uma porta dinâmica na Grove Street. bindKey("e", "down", function() setElementFrozen(theObj, not isElementFrozen(theObj)) -- Congela/descongela essa porta específica ao apertar a tecla E. end) function TextoPortas() for i, portas in ipairs(getElementsByType("object")) do if getElementModel(portas) == 1491 then if isElementFrozen(portas) then dxDrawTextOnElement(portas, "#FF8000[E] #FFFFFFPara Abrir", 1, 6, tocolor(255, 255, 255, 255), 3.1, "default-bold", "center", "center", false, false, false, true) else dxDrawTextOnElement(portas, "#FF8000[E] #FFFFFFPara Fechar", 1, 6, tocolor(255, 255, 255, 255), 3.1, "default-bold", "center", "center", false, false, false, true) end end end end addEventHandler("onClientRender", root, TextoPortas) function dxDrawTextOnElement(theElement, text, height, distance, color, size, font, alignX, alignY, clip, wordBreak, postGUI, colorCoded) local x, y, z = getElementPosition(theElement) local x2, y2, z2 = getCameraMatrix() local distance = distance or 20 local height = height or 1 -- if (isLineOfSightClear(x, y, z+2, x2, y2, z2)) then -- Oculta o texto se tiver algo entre ele e a câmera. local sx, sy = getScreenFromWorldPosition(x, y, z+height) if sx and sy then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if distanceBetweenPoints < distance then dxDrawText(text, sx+2, sy+2, sx, sy, color or 0xFFFFFFFF, (size or 1)-(distanceBetweenPoints / distance), font or "arial", alignX or "center", alignY or "center", clip or false, wordBreak or false, postGUI or false, colorCoded or false) end end -- end end Edited March 25, 2023 by Lord Henry 1
Doongogar Posted March 25, 2023 Author Posted March 25, 2023 obrigado lord, desculpa acabar com a indentação do código, e que eu sou burro mesmo, eu gostaria de saber como eu faço para alterar a posição do texto no eixo X, eu tentei adicionar um argumento na função util dxDrawTextOnElement, porém como o objeto nesse caso é visto como um 3D na função se alterar o eixo X, o texto começa a sair do objeto, existe alguma forma de mudar o texto de posição em relação ao objeto e não em relação ao centro do objeto visto como 3D?
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