×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Script] Timer
[Script] Timer
Laagaadoo
« Citoyen »
1461956700000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#1
  2
  • Início
  • Funções
  • Eventos
  • Exemplo

Início

Oi, nesse tópico vim apresentar um script que facilita a criação de timers.
Com ele você pode criar vários timers ao mesmo tempo facilmente e com algumas opções.

Como usar


Crie um timer usando a função addTimer, ela retorna o ID do timer, que você pode usar depois para removê-lo, também é possível atribuir um rótulo ao timer, nesse caso vamos atribuir o rótulo "teste".
Cuidado pois dois ou mais timers podem ter o mesmo rótulo.
Code Lua

1
2
3
local timer = addTimer(function(i)
tfm.exec.addShamanObject(10, 400, 200)
end, 1000, 5, 'teste')

O timer que fizemos irá invocar uma 1 bigorna a cada 1 segundo (1000 milissegundos) 5 vezes.
Você pode ter reparado que a função que passamos tem um argumento i, este é o número de vezes que o timer já correu.
Vamos mudar um pouco a função. Suponhamos que você queira que na terceira vez que o timer seja acionado, uma tábua seja invocada no lugar da bigorna, e na última vez uma caixa. Basta usar o primeiro argumento da função:

Code Lua

1
2
3
4
5
6
7
8
9
local timer = addTimer(function(i)
if i == 3 then
tfm.exec.addShamanObject(4, 400, 200)
elseif i == 5 then
tfm.exec.addShamanObject(2, 400, 200)
else
tfm.exec.addShamanObject(10, 400, 200)
end
end, 1000, 5, 'teste')

Se você quiser remover um timer, basta usar a função removeTimer passando o ID ou rótulo do timer.
Code Lua

1
2
3
removeTimer(timer)
-- ou
removeTimer('teste')

Se você quiser pausar um timer, basta usar a função pauseTimer passando o ID ou rótulo do timer.
Code Lua

1
2
3
pauseTimer(timer)
-- ou
pauseTimer('teste')

Para resumir um timer pausado, use a função resumeTimer passando o ID ou rótulo do timer.
Code Lua

1
2
3
resumeTimer(timer)
-- ou
resumeTimer('teste')

Se você quiser uma organização maior, pode utilizar o evento eventTimerComplete invéz de checar pelos ciclos feitos. Esse evento é chamado quando um timer não infinito termina todos os ciclos. Exemplo:

Code Lua

1
2
3
4
5
6
7
8
9
local timer = addTimer(function(i) 
tfm.exec.addShamanObject(10, 400, 200)
end, 1000, 5, 'teste')

function eventTimerComplete(id, label)
if id == timer then -- também é possivel verificar pelo label
print('As 5 bigornas foram invocadas!')
end
end

A mensagem "As 5 bigornas foram invocadas!" será exibida depois do timer completar os 5 ciclos.

Você pode remover todos os timers de uma só vez usando a função clearTimers:

Code Lua

1
clearTimers()

Para fazer os timers funcionarem você deve chamar a função timersLoop() no seu eventLoop:
Code Lua

1
2
3
function eventLoop(elapsed, remaining)
timersLoop()
end

Use 0 no número de ciclos se você quiser um timer infinito.
Lembre-se que o primeiro argumento da função do timer é o número de ciclos já feito, portanto os outros argumentos (do segundo em diante) são os argumentos passados para a função do timer, que você definiu.

Atenção: os IDs dos timers são reutilizados, portanto certifique-se de que ao remover, pausar ou resumir um timer você não está afetando na realidade outro timer que você não queria afetar.

Link para o script aqui


Funções


  • addTimer ( callback, time, loops, label, ... )
    Adiciona um novo timer.
      Parâmetros:
      - callback : a função a ser chamada quando um ciclo é completado
      - time : o tempo do timer em milissegundos (deve ser múltiplo de 500, ex: 500, 1000, 1500 etc)
      - loops : a quantia de ciclos a ser feita, use 0 para infinito (padrão = 1)
      - label : um rótulo para o timer (esse rótulo pode ser usado em vários timers) (padrão = nil)
      - ... : os argumentos a serem passados para a callback (o primeiro argumento da callback sempre será o ciclo atual do timer)

  • clearTimers ()
    Remove todos os timers.

  • pauseTimer ( id )
    Pausa um timer.
      Parâmetros:
      - id : o id ou rótulo do timer a ser pausado.

  • removeTimer ( id )
    Remove um timer.
      Parâmetros:
      - id : o id ou rótulo do timer a ser removido.

  • resumeTimer ( id )
    Resume um timer que foi pausado.
      Parâmetros:
      - id : o id ou rótulo do timer a ser resumido.

  • timersLoop ()
    Função que atualiza os timers, deve ser chamada dentro do seu eventLoop()

Eventos


  • eventTimerComplete ( id, label )
    Evento chamado quando um timer não infinito completa todos os ciclos.
      Parâmetros:
      - id : o id do timer
      - label : o rótulo do timer

Este é outro exemplo. Não se esqueça de incluir as funções principais antes de tentar rodar isso.

Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
local first, second, third

tfm.exec.disableAutoShaman()
tfm.exec.disableAutoNewGame()
tfm.exec.disableAfkDeath()

function eventLoop(elapsed, remaining)
timersLoop()
end

function eventNewGame()
clearTimers()

for _,v in pairs{0,1,2,3,4,5,10,11,20,21,30,31} do
ui.removeTextArea(v)
end

first = addTimer(function(i, arg)
ui.addTextArea(0, "<p align='center'><font size='30' color='#000'>"..i.."</font></p>", nil, -1, 101, 800, nil, 0x1, 0x1, 0, true)
ui.addTextArea(1, "<p align='center'><font size='30' color='#009d9d'>"..i.."</font></p>", nil, 0, 100, 800, nil, 0x1, 0x1, 0, true)
end, 1000, 5)

second = addTimer(function(j)
ui.addTextArea(2, "<p align='center'><font size='30' color='#000'>"..j.."</font></p>", nil, -1, 201, 800, nil, 0x1, 0x1, 0, true)
ui.addTextArea(3, "<p align='center'><font size='30' color='#babd2f'>"..j.."</font></p>", nil, 0, 200, 800, nil, 0x1, 0x1, 0, true)
end, 1000, 10)

third = addTimer(function(j)
ui.addTextArea(4, "<p align='center'><font size='30' color='#000'>"..j.."</font></p>", nil, -1, 301, 800, nil, 0x1, 0x1, 0, true)
ui.addTextArea(5, "<p align='center'><font size='30'><VP>"..j.."</font></p>", nil, 0, 300, 800, nil, 0x1, 0x1, 0, true)
end, 1000, 15)
end

function eventTimerComplete(id)
local coords = {[first] = 150, [second] = 250, [third] = 350}

if id == first or id == second or id == third then
ui.addTextArea(id*10, "<p align='center'><font size='18' color='#000'>TERMINOU!</font></p>", nil, -1, coords[id]+1, 800, nil, 0x1, 0x1, 0, true)
ui.addTextArea(id*10+1, "<p align='center'><font size='18'><ROSE>TERMINOU!</font></p>", nil, 0, coords[id], 800, nil, 0x1, 0x1, 0, true)
end
end

tfm.exec.newGame(0)

Dernière modification le 1562959380000
Fofinhoppp
« Consul »
1461962160000
    • Fofinhoppp#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
maravilhoso

Dernière modification le 1487016300000
Igortieni
« Citoyen »
1461968640000
    • Igortieni#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Muito bom o timer
Mescouleur
« Citoyen »
1461971640000
    • Mescouleur#0000
    • Profil
    • Derniers messages
#4
  0
Que legal, pena que não posso testar
Não tenho 1k de queijos.
Squalleze
« Citoyen »
1462021260000
    • Squalleze#0000
    • Profil
    • Derniers messages
    • Tribu
#5
  0
Gj, muito bom :v
Ninguem
« Consul »
1462034100000
    • Ninguem#0095
    • Profil
    • Derniers messages
    • Tribu
#6
  0
Eu mesmo ia criar uma função para facilitar timers sem usar os oficiais (que é ruim na maioria das vezes, pois só permite 40 ao mesmo tempo), mas que bom que você se propôs a fazer, vai nos ajudar muito.

Sugestão pro eventTimerCompleted: poder fornecer uma nome pro timer, já que só o id nem sempre é suficiente para identificar um tipo de timer. Sei que podemos armazenar os ids dos timers que queremos identificar, mas se pudermos colocar uma identificação que pudesse se repetir entre timers de mesmo tipo, facilitaria pra não precisar fazer for pra descobrir se o id do timer está no tal grupo.

function eventTimerComplete(id, label)
if label == "bola" then
print("uma bola foi invocada")
end
end
Laagaadoo
« Citoyen »
1462036860000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#7
  0
Obrigado á todos :)

Ninguem a dit :
Eu mesmo ia criar uma função para facilitar timers sem usar os oficiais (que é ruim na maioria das vezes, pois só permite 40 ao mesmo tempo), mas que bom que você se propôs a fazer, vai nos ajudar muito.

Sugestão pro eventTimerCompleted: poder fornecer uma nome pro timer, já que só o id nem sempre é suficiente para identificar um tipo de timer. Sei que podemos armazenar os ids dos timers que queremos identificar, mas se pudermos colocar uma identificação que pudesse se repetir entre timers de mesmo tipo, facilitaria pra não precisar fazer for pra descobrir se o id do timer está no tal grupo.

function eventTimerComplete(id, label)
if label == "bola" then
print("uma bola foi invocada")
end
end

Obrigado pela sugestão! Atualizei o script, agora é possível adicionar rótulos pros timers.

Dernière modification le 1462037280000
Esh
« Censeur »
1463598180000
    • Esh#0095
    • Profil
    • Derniers messages
    • Tribu
#8
  0
ótima classe
Laagaadoo
« Citoyen »
1463608080000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#9
  0
Eshkation a dit :
ótima classe

obg
Hydroper
« Citoyen »
1487508480000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#10
  0
Parece legal, mas como é uma classe (no título do tópico) seria bom implementar uma classe global ao invés de métodos. E poderia implementar o eventLoop() separadamente como método estático da classe.
Bloom
« Héliaste »
1535320560000
    • Bloom#6766
    • Profil
    • Derniers messages
#11
  0
Parabéns
Laagaadoo
« Citoyen »
1539889740000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#12
  0
Atualizei o script e o tópico, novidades no script:

  • Os IDs agora são reutilizados por meio de uma fila, desse modo o loop no eventLoop fica menor
  • pauseTimer() e resumeTimer() adicionados
  • Agora vc pode usar o rótulo do timer nas funções removeTimer, pauseTimer e resumeTimer
  • timersLoop() adicionado como foi sugestionado nesse post

Atenção ao remover, pausar e resumir timers, pois como o ID agora é reutilizado, você deve certificar-se de que está afetando o timer que realmente quer afetar e não outro que entrou no lugar daquele ID.
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Script] Timer
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27