Jump to content

dxDrawTextOnElement em objetos de tal modelo


Recommended Posts

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

 

Link to comment
  • Other Languages Moderators
  1. 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)
  2. 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.
  3. 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 by Lord Henry
  • Thanks 1
Link to comment

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?

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