×

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
  • /
  • [Tutorial] Sistema de timers (Jp_darkuss#4806)
[Tutorial] Sistema de timers (Jp_darkuss#4806)
Jp_darkuss
« Citoyen »
1587763500000
    • Jp_darkuss#4806
    • Profil
    • Derniers messages
#1
  0
  • Introdução
  • Timer (changelog)
  • Funções
  • Eventos
  • Tree

Muitos programadores de Lua no tfm já apresentaram inúmeros script que ajudam uns aos outros, portanto vim dar minha contribuição, com a criação do meu sistema de timers!

O timer foi baseado no Timer do Laagaadoo, pode ajudar muito na criação de modules, é simples e fácil de usar!

  • Veja como usar!

    Para usar um timer primeiro vamos usar a função de criação timer.create():

    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    local contar= 1
    timer.create("count", "faz uma contagem regressiva", function()
    if (contar< 6) then --a função repete 6 vezes, contanto que a variável contar seja menor que 6, printará a contagem
    print(contar)
    contar= contar + 1
    else
    print("Acabou o tempo!") --no último número informa que acabou a contagem, e o ciclo finaliza
    end
    end, 1000, 6)

    --[[

    > 1
    > 2
    > 3
    > 4
    > 5
    > Acabou o tempo!

    ]]--

    O script roda bem. Vamos agora fazer o mesmo usando outras critérios, como argumentos e eventos!

    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    timer.create("count", "Faz contagem regressiva!", function(p)
    if (timer.get.byTimer("count", "cicle")< 6) then --usamos a função timer.get.byTimer() para pegar em qual ciclo o timer está
    print(timer.get.byTimer("count", "cicle"))
    else
    print(p)
    end
    end, 1000, 6, {"Acabou o tempo!"}) --damos uma string como parâmetro para printar a mensagem final

    --[[

    > 1
    > 2
    > 3
    > 4
    > 5
    > Acabou o tempo!

    ]]--

    Usando parâmetros e uma função interna do script, conseguimos reduzir o tamanho do script!
    O script se adequa a qualquer momento, e você pode usar de várias formas! Se quiser ainda mais controle do script, usurfrua de sua árvore! Só não esqueça de declarar a classe do script, para fazer o script funcionar ;)

    Espero que tenham gostado! :D

    Informações adicionais (script)

    Carregamentos: atualmente o script é carregado em 2 ms
    Tipo: funcional
    Linhas (incluindo eventLoop()): 148 linhas
    Ultima atualização: 25/04/20
    Recomendado em: sistema de contagem regressiva, modules em geral.

    Agradecimentos

    Primeiramente eu agradeço à Deus, por sempre ajudar e me abençoar, e por ter aberto as portas para que eu conseguisse realizar esse feito. Agradeço à todos os programadores desse jogo em geral, porque sem vocês não me teria vindo esse desejo de programar nessa linguagem, e agradeço de forma específica aos jogadores: Sla#3700, Bolodefchoco#0000 e Yuri400#0000, que também me ajudaram nessa jornada de programador.

  • Veja aqui os timers e suas versões

    Versão 1.0 (criação)

    Timer by Jp_darkuss#4806

  • Novidades: funcionalidade padrão


  • Versão 2.0

    Timer by Jp_darkuss#4806

    Versão linha única

  • Novidades:


    - Adicionada a tabela get
    - Adicionado eventos
    - parâmetro decrease agora se chama change (se o número for positivo, aumenta ms, se for negativo, diminui ms)
    - Corrigido bug que quando o ms chegava a 0 o script parava
    - Corrigido o bug que fazia com que o script parasse ao eliminar um timer de forma automática
    - Adicionados argumentos para a função do timer



  • Versão 2.1

    Timer by Jp_darkuss#4806

    Versão linha única

    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    --[[
    Timer by Jp_darkuss#4806
    Create: 24/04/20
    Last update: 19/12/20
    Version: 2.1

    **New**
    * Removed all unecessary things (timer.get, parameters to timer, args, timer.list, eventTimerFinish)
    * Renamed functions (timer.remove, timer.new)
    * Renamed events (eventTimerRemove)
    * Amount of lines decreased
    * Parameter last is a boolean value now

    - disclaimer: it's recommended to do not use the previous versions
    ]]--
    local timer= {} do timer.timers= {} timer.loop= function() for pos in ipairs(timer.timers) do if not timer.timers[pos].paused then timer.timers[pos]._ms= timer.timers[pos]._ms + 500 if timer.timers[pos]._ms>= timer.timers[pos].ms then timer.timers[pos].callback() timer.timers[pos]._ms= 0 if timer.timers[pos]._times~= 0 then timer.timers[pos].times= timer.timers[pos].times - 1 if timer.timers[pos].times<= 0 then local id= timer.timers[pos].id if timer.timers[pos].last then timer.remove(id) else timer.pause(id, true) end end end end end end end timer.new= function(id, ms, callback, times, paused, last) times= times or 0 paused= paused or false last= last or false timer.timers[#timer.timers + 1]= { id= id, ms= ms, callback= callback, times= times, paused= paused, last= last, _ms= 0, _times= times } end timer.remove= function(id) for pos in ipairs(timer.timers) do if timer.timers[pos].id== id then table.remove(timer.timers, pos) if type(eventTimerRemove)=="function" then eventTimerRemove(id) end break end end end timer.pause= function(id, paused, reset) reset= reset or false for pos in next, timer.timers do if timer.timers[pos].id== id then if reset then timer.timers[pos]._ms= 0 timer.timers[pos].times=timer.timers[pos]._times end timer.timers[pos].paused= paused if paused and type(eventTimerPause)=="function" then eventTimerPause(id) end break end end end end

  • Novidades:


    - Removidas todas as coisas desnecessárias (timer.get, parameters to timer, args, timer.list, eventTimerFinish)
    - Funções renomeadas (timer.remove, timer.new)
    - Eventos renomedos (eventTimerRemove)
    - Diminuída a quantidade de linhas
    - Parâmetro last

    * Aviso: é recomendado não usarem as versões anteriores. As mudanças são drásticas mas o funcionamento é o mesmo. Qualquer dúvida me contatem no pv


  • Antes de tudo vamos configura seu timer, para isso, no final dele ponha o seguinte código

    Code Lua

    1
    2
    3
    eventLoop= function()
    timer.loop()
    end

  • timer.create(id, etiqueta, callback, ms, times, args [, change, last, paused])
    Cria um timer
    - Parâmetros

    id (string/number): o id do seu timer
    etiqueta (string): uma descrição do que seu timer faz
    callback (function): a função que seu timer vai executar
    ms (number): a cada quantos milisegundos sua função será chamada (mim 500 ms)
    times (number): quantos ciclos sua função vai executar, 0 para infinito
    args (table): os argumentos de sua função, máximo 5 argumentos (deve ser uma table)
    change (number): em quantos x milisegundos seu ms será alterado, positivo para aumentar e negativo para reduzir (valor padrão: 0)
    last (string): a ultima ação de seu timer: "pause" (será pausado), "kill" (será excluído) (valor padrão: "pause")
    paused (boolean): se ele está pausado ou não (valor padrão: false)


  • timer.list()
    Cita no chat #lua todos os timers

  • timer.kill(id)
    Destrói um timer
    - Parâmetros

    id (string/number): o id do timer

  • timer.pause(id, pause)
    Pausa um timer
    - Parâmetros

    id (string/number): o id do timer
    pause (boolean): se ele deve ou não estar pausado

  • Tabela get


    Use essa função para pegar informações que seus timers guardam!

  • timer.get.timer(id)
    Retorna o endereço do timer
    - Parâmetros

    id (string/number): o id do timer

  • timer.get.byTimer(id, what)
    Retorna uma informação do timer
    - Parâmetros

    id (string/number): o id do timer
    what (string): o que você quer que ela retorne, "ms" para os milisegundos padrão do timer, "cicle" o atual ciclo do timer, "times" a quantidade de ciclos que seu timer deve executar

  • Veja aqui os eventos que ocorrem durante a execução do script!


    Obs: atualmente só funcionam em timers não infinitos!

  • eventTimerStart(id)
    Ocorre quando um timer inicia
    - Retorna

    id (string/number): o id do timer

  • eventTimerFinish(id)
    Ocorre quando um timer é finalizado
    - Retorna

    id (string/number): o id do timer

  • eventTimerPause(id, cicle)
    Ocorre quando um timer é pausado
    - Retorna

    id (string/number): o id do timer
    cicle (string/number): o ciclo que o timer estava executando quando foi pausado

  • eventTimerKill(id, cicle)
    Ocorre quando um timer é eliminado
    - Retorna

    id (string/number): o id do timer
    cicle (string/number): o ciclo que o timer estava executando quando foi pausado
  • Árvore do script (inútil para a última versão)



    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
    timers --table
    adress --number
    ms --number
    times --number
    callback --function
    id --string/number
    etiqueta --string
    or_times --o mesmo que times (inalterável)
    last --string
    paused --boolean
    change --number
    arg1 -- argumento 1
    arg2 -- argumento 2
    arg3 -- argumento 3
    arg4 -- argumento 4
    arg5 -- argumento 5
    timer --table
    create --function
    list --function
    kill --function
    pause --function
    get --table
    timer --function
    byTimer --function

    Exemplo

    Digamos que use o parâmetro etiqueta, e queira imprimi-lo:

    Code Lua

    1
    2
    3
    4
    5
    timer.create("Teste", ">> etiqueta impressa aqui", function()
    print(timers[timer.get.timer("Teste")].etiqueta)
    end, 1000, 0)

    -- >> etiqueta impressa aqui

    A função timer.get.timer() retorna a localização numérica do seu timer, daí usando o conhecimentos de tables e a árvores, consegui usar sua etiqueta.

    Para usar a árvore é bom que saiba lidar com tables e objetos num script. A função timer.get.timer() poderia ser substituída por um número qualquer, desde que saiba a localização do timer.



    Dernière modification le 1608409860000
    Jp_darkuss
    « Citoyen »
    1587763560000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #2
      0
    Tópico aberto a críticas, sugestões e relato de bugs! :3

    Obs: se algum sentinela passar por aqui, eu peço que por favor mude o nome do tópico para [Script] Sistema de Timers (Jp_darkuss#4806), esqueci de pôr uma parte importante, e não quero infligir as regras do fórum. Agradeço à quem fizer este favor, obrigado.

    Dernière modification le 1587921240000
    Jp_darkuss
    « Citoyen »
    1587847740000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #3
      0
    Atualização disponível.
    Gamedroit
    « Citoyen »
    1587918900000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #4
      0
    a dit :

    timer.kill(id)
    Cria um timer
    - Parâmetros

    id (string/number): o id do timer

    Tenho quase certeza que a função do timer.kill não é criar outro timer ...

    @Edit: Eu não vejo tanto diferença entre usar seu script ou o do Laag mas ficou bom.

    Dernière modification le 1587918960000
    Jp_darkuss
    « Citoyen »
    1587921360000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #5
      0
    Contistente3 a dit :
    a dit :

    timer.kill(id)
    Cria um timer
    - Parâmetros

    id (string/number): o id do timer

    Tenho quase certeza que a função do timer.kill não é criar outro timer ...

    @Edit: Eu não vejo tanto diferença entre usar seu script ou o do Laag mas ficou bom.

    Já consertei, obrigado. Tive preguiça de ficar digitando tudo e dei Ctrl + c/v depois do primeiro, daí esqueci de mudar a descrição kkkkk
    Gamedroit
    « Citoyen »
    1587927300000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #6
      0
    Jp_darkuss a dit :
    Contistente3 a dit :
    a dit :

    timer.kill(id)
    Cria um timer
    - Parâmetros

    id (string/number): o id do timer

    Tenho quase certeza que a função do timer.kill não é criar outro timer ...

    @Edit: Eu não vejo tanto diferença entre usar seu script ou o do Laag mas ficou bom.

    Já consertei, obrigado. Tive preguiça de ficar digitando tudo e dei Ctrl + c/v depois do primeiro, daí esqueci de mudar a descrição kkkkk

    Sobre o script, quando você estiver criando um novo índice na tabela ele não precisa ser necessariamente entre colchetes e com aspas quando for do tipo string, Você pode somente fazer
    Code Lua

    1
    2
    tabela = { novoIndice = 16 }
    print(tabela.novoIndice) -- 16
    Mas para outros tipos não string que forem usados como índice é obrigatório uso de colchetes
    Jp_darkuss
    « Citoyen »
    1587933000000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #7
      1
    Contistente3 a dit :
    Jp_darkuss a dit :
    Contistente3 a dit :
    a dit :

    timer.kill(id)
    Cria um timer
    - Parâmetros

    id (string/number): o id do timer

    Tenho quase certeza que a função do timer.kill não é criar outro timer ...

    @Edit: Eu não vejo tanto diferença entre usar seu script ou o do Laag mas ficou bom.

    Já consertei, obrigado. Tive preguiça de ficar digitando tudo e dei Ctrl + c/v depois do primeiro, daí esqueci de mudar a descrição kkkkk

    Sobre o script, quando você estiver criando um novo índice na tabela ele não precisa ser necessariamente entre colchetes e com aspas quando for do tipo string, Você pode somente fazer
    Code Lua

    1
    2
    tabela = { novoIndice = 16 }
    print(tabela.novoIndice) -- 16
    Mas para outros tipos não string que forem usados como índice é obrigatório uso de colchetes

    Obrigado pela dica, mas em cada linguagem eu uso diferentes formas, como:


    Code Lua

    1
    2
    3
    4
    local tabela= {
    ["primeiro"]= 12
    }
    print(tabela.primeiro)

    Code Javascript

    1
    2
    3
    4
    var tabela= {
    primeiro: 12;
    };
    console.log(tabela.primeiro);

    Code C

    1
    2
    3
    4
    struct a {
    int primeiro;
    } tabela= {12};
    printf("%i", tabela.primeiro);


    Uma coisa que marca muito um programador é seu estilo, o script de um programador para outro tem sempre seu toque marcante, fruto do seu aprendizado ou das características dele, e é algo que muito prezo.

    Eu busco seguir as normas da linguagem, mas acima de tudo fazer de uma forma que seja confortável para mim, mas obrigado.

    Dernière modification le 1587933420000
    Gamedroit
    « Citoyen »
    1587951180000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #8
      0
    Deu um problema aqui, se algum moderador/sentinela vir por favor apague está mensagem.

    Dernière modification le 1587951600000
    Gamedroit
    « Citoyen »
    1587951600000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #9
      0
    Jp_darkuss
    Jp_darkuss a dit :
    Contistente3 a dit :
    Jp_darkuss a dit :
    Contistente3 a dit :
    a dit :

    timer.kill(id)
    Cria um timer
    - Parâmetros

    id (string/number): o id do timer

    Tenho quase certeza que a função do timer.kill não é criar outro timer ...

    @Edit: Eu não vejo tanto diferença entre usar seu script ou o do Laag mas ficou bom.

    Já consertei, obrigado. Tive preguiça de ficar digitando tudo e dei Ctrl + c/v depois do primeiro, daí esqueci de mudar a descrição kkkkk

    Sobre o script, quando você estiver criando um novo índice na tabela ele não precisa ser necessariamente entre colchetes e com aspas quando for do tipo string, Você pode somente fazer
    Code Lua

    1
    2
    tabela = { novoIndice = 16 }
    print(tabela.novoIndice) -- 16
    Mas para outros tipos não string que forem usados como índice é obrigatório uso de colchetes

    Obrigado pela dica, mas em cada linguagem eu uso diferentes formas, como:


    Code Lua

    1
    2
    3
    4
    local tabela= {
    ["primeiro"]= 12
    }
    print(tabela.primeiro)

    Code Javascript

    1
    2
    3
    4
    var tabela= {
    primeiro: 12;
    };
    console.log(tabela.primeiro);

    Code C

    1
    2
    3
    4
    struct a {
    int primeiro;
    } tabela= {12};
    printf("%i", tabela.primeiro);


    Uma coisa que marca muito um programador é seu estilo, o script de um programador para outro tem sempre seu toque marcante, fruto do seu aprendizado ou das características dele, e é algo que muito prezo.

    Eu busco seguir as normas da linguagem, mas acima de tudo fazer de uma forma que seja confortável para mim, mas obrigado.

    Sobre o script, quando você estiver criando um novo índice na tabela ele não precisa ser necessariamente entre colchetes e com aspas quando for do tipo string, Você pode somente fazer
    Code Lua

    1
    2
    tabela = { novoIndice = 16 }
    print(tabela.novoIndice) -- 16
    Mas para outros tipos não string que forem usados como índice é obrigatório uso de colchetes[/quote]

    Obrigado pela dica, mas em cada linguagem eu uso diferentes formas, como:

    [spoiler]
    Code Lua

    1
    2
    3
    4
    local tabela= {
    ["primeiro"]= 12
    }
    print(tabela.primeiro)

    Code Javascript

    1
    2
    3
    4
    var tabela= {
    primeiro: 12;
    };
    console.log(tabela.primeiro);

    Code C

    1
    2
    3
    4
    struct a {
    int primeiro;
    } tabela= {12};
    printf("%i", tabela.primeiro);


    Você já parou para pensar em tanto faz a maneira que você escreve? Existem milhares de programadores no mundo, programar de maneira x ou y não vai te dar vantagem alguma se você somente pensar em estilo, e os exemplos que você citou, what a hell? Isso se trata de sintaxe e não estilo cara, as linguagens tem regras não diga estilo como se em javascript você pudesse escrever {Index = 0}, isso daria erro de execução, a mesma vale para lua, se fosse somente estilo certamente eu poderia fazer {Index: 0} em lua

    PS: É muito melhor encontrar uma forma padrão e familiar para programar do que criar 300 formas de programar. Eu por exemplo em JavaScript e Lua faço os índices sem aspas com a única diferença dos símbolos "=" e ":"

    PS²: Eu acredito que a única norma externa da qual você precisa seguir em se tratando de linguagens em geral é camelCase ou PascalCase, mas de resto não é realmente importante, já as normas que fazem a linguagem funcionar seria a sintaxe ou regra de linguagem.

    Dernière modification le 1587951900000
    Fofinhoppp
    « Consul »
    1587958260000
      • Fofinhoppp#0000
      • Profil
      • Derniers messages
      • Tribu
    #10
      0
    Parabéns pelo tópico, é muito bom ver que a seção está voltando à ativa! Eu particularmente não vejo problemas em ter seu próprio estilo na hora de programar. Se levar ao pé da letra, lua não precisaria nem de identação também.
    Gamedroit
    « Citoyen »
    1587963060000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #11
      0
    Fofinhoppp a dit :
    Parabéns pelo tópico, é muito bom ver que a seção está voltando à ativa! Eu particularmente não vejo problemas em ter seu próprio estilo na hora de programar. Se levar ao pé da letra, lua não precisaria nem de identação também.

    Bem, eu concordo com você Fofi, mas em vez de ficar pensando em um "estilo" diferente para cada linguagem de programação não seria mais simples ter um toque familiar? Certamente você pegaria o jeito mais rápido. De toda forma cada um programa da maneira que quiser, eu simplesmente expressei minha opinião assim como todos são livres para fazer.

    Dernière modification le 1587963180000
    Jp_darkuss
    « Citoyen »
    1591045860000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #12
      0
    Versão linha única disponível para a versão 2.0
    • Forums
    • /
    • Transformice
    • /
    • Modules
    • /
    • [Tutorial] Sistema de timers (Jp_darkuss#4806)
    © Atelier801 2018

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

    Version 1.27