Jump to content

Aumentar/diminuir alpha de elemento DX gradualmente.


ber

Recommended Posts

Estou fazendo um sistema de infobox e quando chega uma notificação ela vai aparecendo aos poucos por conta do alpha que vai aumentando, eu fiz de uma maneira simples, uma variável que começa com 0 e a cada onClientRender aumenta 3. Até que funcionou, mas o tempo que aparece e some varia para os players dependendo de quantos FPS roda o jogo dele, por conta do aumento da variável estar num evento onClientRender. Tem como fazer de outra maneira que fique igual para todos os players independentemente do FPS?

Exemplo:
 

local alpha = 0

function render()
	dxDrawImage(x, y, x2, y2, "gfx/test.png", tocolor(255, 255, 255, alpha))
	alpha = alpha + 3
end
addEventHandler("onClientRender", root, render)

 

Edited by ber
Link to comment
  • Other Languages Moderators

Tem sim. Utilize GetTickCount para obter o momento do início do fade e salve numa variável. Depois durante o onClientRender utilize outro GetTickCount e salve em outra variável. Vc pode obter o tempo exato que se passou diminuindo o primeiro do segundo e assim calculando o alpha igual para todos.

Exemplo maroto:

local inicio = getTickCount() -- Marca o instante em que este resource iniciou.
local screenX, screenY = guiGetScreenSize() -- Resolução do jogador.
local duration = 2 -- Quantos segundos o efeito de fade deve demorar.

function render ()
    local agora = getTickCount() -- Marca o instante deste frame.
    local diferenca = agora - inicio -- Calcula quantos milisegundos se passaram desde o instante que este resource iniciou até o momento do frame atual.
    local alpha = diferenca / (4 * duration) -- Só pra não ficar rápido demais, caso contrário o efeito iria durar apenas 255 milisegundos.
    if (alpha > 255) then
        alpha = 255 -- Evita erros de valores acima do permitido no alpha.
    end
    dxDrawText ("TESTE", 0, 0, screenX, screenY, tocolor (255, 255, 255, math.abs (alpha)), 2, "default-bold", "center", "center")
end
addEventHandler ("onClientRender", root, render)

 

Edited by Lord Henry
Link to comment
On 29/11/2020 at 18:50, Lord Henry said:

Tem sim. Utilize GetTickCount para obter o momento do início do fade e salve numa variável. Depois durante o onClientRender utilize outro GetTickCount e salve em outra variável. Vc pode obter o tempo exato que se passou diminuindo o primeiro do segundo e assim calculando o alpha igual para todos.

Exemplo maroto:


local inicio = getTickCount() -- Marca o instante em que este resource iniciou.
local screenX, screenY = guiGetScreenSize() -- Resolução do jogador.
local duration = 2 -- Quantos segundos o efeito de fade deve demorar.

function render ()
    local agora = getTickCount() -- Marca o instante deste frame.
    local diferenca = agora - inicio -- Calcula quantos milisegundos se passaram desde o instante que este resource iniciou até o momento do frame atual.
  	local alpha = diferenca / (4 * duration) -- Só pra não ficar rápido demais, caso contrário o efeito iria durar apenas 255 milisegundos.
    if (alpha > 255) then
        alpha = 255 -- Evita erros de valores acima do permitido no alpha.
    end
    dxDrawText ("TESTE", 0, 0, screenX, screenY, tocolor (255, 255, 255, math.abs (alpha)), 2, "default-bold", "center", "center")
end
addEventHandler ("onClientRender", root, render)

 

Entendi, achei um pouco confuso pois eu irei utilizar em um infobox que aparecem diversas mensagens simultâneas. Então, pensei se ao invés de utilizar o onClientRender usar um setTimer que aí eu configuro o tempo que eu quero, é possível fazer desta maneira?

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