Jump to content

Animação de carregamento


Recommended Posts

Posted (edited)

Como posso fazer uma animação de carregamento nesse estilo? Eu estou aprendendo Lua então, você pode ajudar no agradeço.




loading.gif.

Edited by Matheus Schumann
Posted
7 hours ago, Matheus Schumann said:

Como posso fazer uma animação de carregamento nesse estilo? Eu estou aprendendo Lua então, você pode ajudar no agradeço.




loading.gif.

Movimentando o topico. Alguem pra da uma força ?

  • Other Languages Moderators
Posted

Vc vai precisar ter 1 imagem de cada frame da "animação". No caso uma imagem com aquele quadrado branco em cada posição. (se eu contei certo, 9 imagens)

Depois vc coloca todas as imagens em uma table.

Com uma variável de contador, vc usa como iterador para mostrar uma imagem diferente a cada frame, em sequência. E claro, um onClientRender pra manter tudo visível na tela.

loadingTextures = { -- As imagens precisam estar declaradas no meta.xml. Se for colocar dentro de uma pasta dentro do resource, a pasta precisa estar declarada também. Ex: imagens/loading1.png
    dxCreateTexture("loading1.png", "dxt1", true), -- Os nomes não importam, mas cada imagem precisa estar na ordem correta nessa table.
    dxCreateTexture("loading2.png", "dxt1", true), -- Imagem 2. Pode ser acessada com loadingTextures[2]
    dxCreateTexture("loading3.png", "dxt1", true), -- Imagem 3. 
    dxCreateTexture("loading4.png", "dxt1", true), -- E assim por diante.
    dxCreateTexture("loading5.png", "dxt1", true),
    dxCreateTexture("loading6.png", "dxt1", true), -- dxt1 indica compressão máxima da imagem. A qualidade só fica terrível se houver transparência.
    dxCreateTexture("loading7.png", "dxt1", true), -- O true indica o uso de MipMaps. A imagem fica boa mesmo se for desenhada em vários tamanhos.
    dxCreateTexture("loading8.png", "dxt1", true),
    dxCreateTexture("loading9.png", "dxt1", true), -- Imagem 9.
}

local contador = 1 -- Variável qualquer que vai variar de 1 até #loadingTextures (9).
local x, y = guiGetScreenSize() -- x, y recebem a resolução do jogador. Ex: x = 1920, y = 1080.

function renderLoading ()
    if (contador <= #loadingTextures) then -- Se o contador for menor ou igual a 9, então:
        dxDrawImage (0, 0, x, y, loadingTextures[contador]) -- Desenha em tela cheia a imagem que está no loadingTextures[contador].
    else
        contador = 1 -- Reinicia o contador, pois ao chegar aqui, contador seria igual a 10, mas não existe a imagem 10 na sequência.
        dxDrawImage (0, 0, x, y, loadingTextures[contador]) -- Desenha em tela cheia a primeira imagem da sequência.
    end
    contador = contador + 1 -- Antes de passar pro frame seguinte, aumenta o contador em +1.
end


addCommandHandler ("loading", function (cmd) -- Comando para testes, faz aparecer/sumir a tela de loading em quem usou o comando.
    if (isRendering) then
        removeEventHandler ("onClientRender", root, renderLoading)
    else
        addEventHandler ("onClientRender", root, renderLoading)
    end
    isRendering = not isRendering -- A variável isRendering fica alternando entre True e False a cada vez que o jogador usa /loading
end)

--[[OBS: Sim, você pode declarar o nome da imagem direto no dxDrawImage, mas seria mais pesado e você teria que fazer gambiarras
pra chamar diferentes imagens a cada frame, uma vez que os nomes seriam diferentes. Vale lembrar que onClientRender executa uma vez
a cada frame, ou seja, várias vezes por segundo. Não há tempo para ficar carregando e descarregando arquivos.

Outra coisa: Recomendo que use imagens em Full HD, pois imagens pequenas irão distorcer bastante se o jogador estiver usando
resoluções maiores. A não ser que você não se importe com isso.]]

 

  • Thanks 1
Posted (edited)
16 hours ago, Lord Henry said:

Vc vai precisar ter 1 imagem de cada frame da "animação". No caso uma imagem com aquele quadrado branco em cada posição. (se eu contei certo, 9 imagens)

Depois vc coloca todas as imagens em uma table.

Com uma variável de contador, vc usa como iterador para mostrar uma imagem diferente a cada frame, em sequência. E claro, um onClientRender pra manter tudo visível na tela.


loadingTextures = { -- As imagens precisam estar declaradas no meta.xml. Se for colocar dentro de uma pasta dentro do resource, a pasta precisa estar declarada também. Ex: imagens/loading1.png
    dxCreateTexture("loading1.png", "dxt1", true), -- Os nomes não importam, mas cada imagem precisa estar na ordem correta nessa table.
    dxCreateTexture("loading2.png", "dxt1", true), -- Imagem 2. Pode ser acessada com loadingTextures[2]
    dxCreateTexture("loading3.png", "dxt1", true), -- Imagem 3. 
    dxCreateTexture("loading4.png", "dxt1", true), -- E assim por diante.
    dxCreateTexture("loading5.png", "dxt1", true),
    dxCreateTexture("loading6.png", "dxt1", true), -- dxt1 indica compressão máxima da imagem. A qualidade só fica terrível se houver transparência.
    dxCreateTexture("loading7.png", "dxt1", true), -- O true indica o uso de MipMaps. A imagem fica boa mesmo se for desenhada em vários tamanhos.
    dxCreateTexture("loading8.png", "dxt1", true),
    dxCreateTexture("loading9.png", "dxt1", true), -- Imagem 9.
}

local contador = 1 -- Variável qualquer que vai variar de 1 até #loadingTextures (9).
local x, y = guiGetScreenSize() -- x, y recebem a resolução do jogador. Ex: x = 1920, y = 1080.

function renderLoading ()
    if (contador <= #loadingTextures) then -- Se o contador for menor ou igual a 9, então:
        dxDrawImage (0, 0, x, y, loadingTextures[contador]) -- Desenha em tela cheia a imagem que está no loadingTextures[contador].
    else
        contador = 1 -- Reinicia o contador, pois ao chegar aqui, contador seria igual a 10, mas não existe a imagem 10 na sequência.
        dxDrawImage (0, 0, x, y, loadingTextures[contador]) -- Desenha em tela cheia a primeira imagem da sequência.
    end
    contador = contador + 1 -- Antes de passar pro frame seguinte, aumenta o contador em +1.
end


addCommandHandler ("loading", function (cmd) -- Comando para testes, faz aparecer/sumir a tela de loading em quem usou o comando.
    if (isRendering) then
        removeEventHandler ("onClientRender", root, renderLoading)
    else
        addEventHandler ("onClientRender", root, renderLoading)
    end
    isRendering = not isRendering -- A variável isRendering fica alternando entre True e False a cada vez que o jogador usa /loading
end)

--[[OBS: Sim, você pode declarar o nome da imagem direto no dxDrawImage, mas seria mais pesado e você teria que fazer gambiarras
pra chamar diferentes imagens a cada frame, uma vez que os nomes seriam diferentes. Vale lembrar que onClientRender executa uma vez
a cada frame, ou seja, várias vezes por segundo. Não há tempo para ficar carregando e descarregando arquivos.

Outra coisa: Recomendo que use imagens em Full HD, pois imagens pequenas irão distorcer bastante se o jogador estiver usando
resoluções maiores. A não ser que você não se importe com isso.]]

 

Ajudou muito. Obrigado.

Edited by Matheus Schumann

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