Developer. Posted October 28, 2019 Share Posted October 28, 2019 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 Lord Henry Posted October 29, 2019 Other Languages Moderators Share Posted October 29, 2019 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) 1 Link to comment
DNL291 Posted October 29, 2019 Share Posted October 29, 2019 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> 1 Link to comment
Developer. Posted October 29, 2019 Author Share Posted October 29, 2019 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 Lord Henry Posted October 29, 2019 Other Languages Moderators Share Posted October 29, 2019 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") 1 Link to comment
Developer. Posted October 29, 2019 Author Share Posted October 29, 2019 Ahhhhh compreendi, na minha ignorância achei q a função "tostring" realmente convertia o numero 1 na palavra UM, que ficaria tipo imgUM.png Thanks pela ajuda Link to comment
Other Languages Moderators Lord Henry Posted October 29, 2019 Other Languages Moderators Share Posted October 29, 2019 Ah, hauhauahuah. Não, não. Tostring converte 1 (número) para "1" (texto) 1 Link to comment
Developer. Posted October 29, 2019 Author Share Posted October 29, 2019 Kkkkkk, percebi isso agora. Fui atrás de uns tutoriais e mostraram isso mesmo xD. Link to comment
DNL291 Posted October 29, 2019 Share Posted October 29, 2019 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. 1 Link to comment
Developer. Posted October 29, 2019 Author Share Posted October 29, 2019 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 sinistro 1 Link to comment
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