Jump to content

[AJUDA] Loop com duas imagens


Recommended Posts

Opa, seguinte estou fazendo um dx de download porém queria fazer da seguinte forma. Este dx conta com duas imagens de fundo, onde as mesmas contém regras, link's, etc... O que eu quero é que elas se alterne entre si a cada 20000 ms. Ex: começa com a imagem 1, após 20 segundos muda para a imagem 2, se passando mais 20 segundos volta para a imagem 1 e assim sucessivamente até o player receber a data de download concluído! Tentei fazer um loop mas não deu nada certo... estou meio perdido! No momento o código se encontra dessa forma:

Obs: essa é só uma parte do código, no caso onde eu gostaria de fazer esse "loop" de imagens.

tempoChange1 = 20000

function MudarFundo ()
    img1()
    setTimer(function() 
      if dataPlayer == false then
        removeEventHandler ("onClientRender", getRootElement(), img1)
        addEventHandler("onClientRender", getRootElement(), img2)
      else
        removeEventHandler("onClientRender", getRootElement(), img1) 
        removeEventHandler("onClientRender", getRootElement(), img2) 
      end
    end, tempoChange1, 1)
end
addEventHandler ("onClientRender", root, MudarFundo)

 

Link to comment
  • Other Languages Moderators
local imagens = {
	[1] = dxCreateTexture ("imagem01.png"),
	[2] = dxCreateTexture ("imagem02.png"),
}

local tempo = 20 -- Em segundos.
local frame = 1
local sX, sY = guiGetScreenSize () -- Recebe a resolução do jogador. Ex: sX = 1366, sY = 768

function renderImage ()
	dxDrawImage (0, 0, sX, sY, imagens[frame]) -- Mostra a imagem 1 ou a imagem 2, dependendo do valor da variável frame.
end
addEventHandler ("onClientRender", root, renderImage)

theTimer = setTimer (function () -- Timer que alterna o valor da variável frame de 1 e 2 a cada 20 segundos. Você pode adicionar mais imagens depois, se quiser.
	if (frame == 1) then
		frame = 2
	else
		frame = 1
	end
end, tempo*1000, 0)

 

  • Thanks 1
Link to comment
  • Moderators

Aqui um exemplo com a lógica:


local imagensTotal = 2
local imgAtual =  1
local tick = getTickCount()

-- isto dentro do onClientRender
if getTickCount()-tick > 20000 then
	tick = getTickCount()
	imgAtual = (imgAtual == imagensTotal and 1) or (imgAtual + 1)
end

Que ficaria assim:

local imagensTotal = 2
local imgAtual =  1

addEventHandler("onClientResourceStart", resourceRoot, function()
    local tick = getTickCount()
	addEventHandler("onClientRender", root, renderImgBackground)
end)

function renderImgBackground()
	if getTickCount()-tick > 20000 then
		tick = getTickCount()
		imgAtual = (imgAtual == imagensTotal and 1) or (imgAtual + 1)
	end
	dxDrawImage( x, y, width, height, tostring(imgAtual)..".png" )
end

Neste resource você vai precisar dar prioridade no download. Coloque no meta, por exemplo:

<download_priority_group>10</download_priority_group>

 

  • Thanks 1
Link to comment
34 minutes ago, DNL291 said:

Aqui um exemplo com a lógica:


local imagensTotal = 2
local imgAtual =  1
local tick = getTickCount()

-- isto dentro do onClientRender
if getTickCount()-tick > 20000 then
	tick = getTickCount()
	imgAtual = (imgAtual == imagensTotal and 1) or (imgAtual + 1)
end

Que ficaria assim:


local imagensTotal = 2
local imgAtual =  1

addEventHandler("onClientResourceStart", resourceRoot, function()
    local tick = getTickCount()
	addEventHandler("onClientRender", root, renderImgBackground)
end)

function renderImgBackground()
	if getTickCount()-tick > 20000 then
		tick = getTickCount()
		imgAtual = (imgAtual == imagensTotal and 1) or (imgAtual + 1)
	end
	dxDrawImage( x, y, width, height, tostring(imgAtual)..".png" )
end

Neste resource você vai precisar dar prioridade no download. Coloque no meta, por exemplo:


<download_priority_group>10</download_priority_group>

 

Ah do setTimer eu consegui compreender ela normal, mas essa do getTick me perdi todo, no caso vc fez assim:

 

- definiu as variáveis

- adicionou um evento de start
- salvo o tempo (getTick)
- adicionou o render

na outra function você

- verificou o tempo 
- salvou novamente
- criou a variável (imgAtual) = ( 1 == 2 e 1) ou (1 + 1) ? ( essa parte dessa conta q eu nn entendi...)
- no fim o resultado dessa conta se torna uma string no dx é isso?

Eu poderia transformar essa "tostring" em uma "tonumber" ? 
Já que no caso o nome das imagens é img1.png e img 2.png

Link to comment
  • Other Languages Moderators
9 minutes ago, Eder said:

Eu poderia transformar essa "tostring" em uma "tonumber" ? 
Já que no caso o nome das imagens é img1.png e img 2.png

Não há motivo para usar tonumber, pois imgAtual já é um número. Não existe lógica em converter número para um número.

Você pode fazer isso:

dxDrawImage (x, y, width, height, "img"..tostring(imgAtual)..".png")

 

  • Thanks 1
Link to comment
  • Moderators

getTickCount vai retornar sempre um valor diferente, a cada execução, pois ele retorna o tempo em milissegundos desde que o sistema do servidor foi iniciado (clientside o do sistema do cliente).

Então isto:

local tick = getTickCount()

No onClientResourceStart, vai guardar o tempo do momento que o onClientResourceStart ocorrer.

É como um cronômetro, você aperta ele e fazendo uma analogia, a variável tick = getTickCount é executada. Então você para esse cronometro e você quer saber quanto tempo se passou, então terá de fazer o seguinte, já tendo o 'tick' com o tempo em que o cronômetro foi ativado:

tempo_decorrido = getTickCount() - tick
print("se passaram ".. tempo_decorrido .." milissegundos" )

* Lembrando que getTickCount() sempre será maior que o 'tick' armazenado anteriormente. Então:

tick-getTickCount()

É uma forma equivocada de subtrair, isso vai retornar um valor negativo.

Não sei se conseguiu entender, mas é essa lógica que está no código.

if getTickCount()-tick > 20000 then
  --[[
  	Subtrai o tempo atual com o tempo armazenado na variável 'tick'
  	e verifica se a diferença é de 20000ms (20 segundos)
  
  	Se for, armazena novamente getTickCount na variável 'tick' e esse ciclo sempre irá
  	se repetir
  ]]

Quanto a este trecho:

imgAtual = (imgAtual == imagensTotal and 1) or (imgAtual + 1)

É uma simplificação de uma condição if (operação ternária com and, or).

Com if statements ficaria assim:

if imgAtual == 2 then
	imgAtual = 1
else
	imgAtual = imgAtual+ 1
end

imgAtual == imagensTotal

Isso representa uma comparação, e irá retornar uma boolean (true/false)

Aplicando no exemplo do meu código, se for true imgAtual irá receber 1 or (se não for) imgAtual terá o valor de imgAtual + 1

Vai retornar uma interger (número inteiro). Por isso lá no dxDrawImage estou convertendo para uma string, que seria "1.png" imagem com o nome 1, extensão png.

Se suas imagens são na sequencia img1.png, img2.png basta você fazer um tostring da forma que o Lord Henry mostrou.

 

  • Thanks 1
Link to comment

Caaaraaaaca saquei, você fez praticamente a mesma coisa que o Lord Henry nas linhas 16 á 20, porém com menos código O.O caraca mané.

E a parte do tick tbm entendi, você criou um loop com o tick sem necessitar de uma tabela escrita... Basicamente automatizou a parada O.o sinistro o.O

  • Like 1
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...