×

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] Callbacks de text areas
[Tutorial] Callbacks de text areas
Esh
« Censeur »
1463969040000
    • Esh#0095
    • Profil
    • Derniers messages
    • Tribu
#1
  4
Callbacks de text areas
    Sempre quis fazer um menu utilizando text areas para seu script/minigame mas não sabe como? Aqui você irá aprender a utilizar os callbacks!
    Tags âncoras
      Os callback utilizam as tags âncoras(<a>) para permitir que os mesmos sejam ativados. O argumento href da tag precisa começar com "event:" para que esta tag seja reconhecida pelo lua:

        <a href="event:mostrarAjuda">Ajuda</a>

      No exemplo acima, temos uma tag âncora com um evento: mostrarAjuda, que ao ser clicada, ativará o eventTextareaCallback, contendo o id da text area clicada, o nome do jogador e o correspondente callback.

        ui.addTextArea(1, '<a href="event:mostrarAjuda">Ajuda</a>', nil, 300, 100, 200, 100)
        function eventTextAreaCallback(id, jogador, callback)
          print("O jogador "..jogador.." clicou na text area "..id.." com o callback "..callback)
        end

      O eventTextAreaCallback será ativado toda vez que o jogador clicar em "Ajuda".

    Criando uma framework para callbacks
      Agora que sabemos como utilizar as callbacks, é interessante criar uma função - simples -, que lide com os callbacks de forma fácil: a ideia é criar uma função que transforme o callback "show_help" em um "chamador" de função.
      I. modelo do callback
        Iremos criar um padrão para nossos callbacks, assim podemos criar as funções facilmente:
          event:nomeDoCallBack#arg1,arg2,arg3,...

        O nomeDoCallBack irá abrigar o nome do callback e o sufixo da função que ele irá chamar, todo o texto após # será divido por virgulas e transformados em argumentos para a função.

      II. construindo eventTextAreaCallback
        A função eventTextAreaCallback que atende os eventos das text areas irá funcionar como uma central, distribuindo os argumentos dos callbacks para as funções menores. Para isso vamos utilizar a tabela _G para checar se o callback está registrado como uma função:
          function eventTextAreaCallback(id, jogador, callback)
            local callbackName, callbackData = table.unpack(string.split(callback, "#"))
            if type(_G["onCallback_"..callbackName]) == "function" then
              _G["onCallback_"..callbackName](id, jogador, table.unpack(string.split(callbackData or "", ",")))
            end
          end

          function string.split(rawString, separator)
            splittedString = {}
              if rawString and separator then
                for str in string.gmatch(rawString, "[^"..separator.."]+") do
                table.insert(splittedString, str)
              end
            end
            return splittedString
          end

        Utilizando este código, a função eventTextAreaCallback vai se tornar um distribuidor, checando se a função "onCallback_nomeDoCallBack" existe, e se caso exista, passando o nome do jogador, id da text area e os argumentos do callback para ela. Você pode checar um exemplo aqui.
Putofobico
« Citoyen »
1463973540000
    • Putofobico#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
Vai ser bem útil. Bem útil mesmo.
Igortieni
« Citoyen »
1464010620000
    • Igortieni#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
putofobico a dit :
Vai ser bem útil. Bem útil mesmo.
Laagaadoo
« Citoyen »
1464021000000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#4
  0
ótimo tutorial e framework
Impressorahp
« Citoyen »
1473098940000
    • Impressorahp#2775
    • Profil
    • Derniers messages
    • Tribu
#5
  0
Me ajudou muito!^^
Ernyk
« Citoyen »
1499853900000
    • Ernyk#0000
    • Profil
    • Derniers messages
    • Tribu
#6
  0
:c n tou a conseguir
Jellymichey
« Censeur »
1499865060000
    • Jellymichey#0000
    • Profil
    • Derniers messages
    • Tribu
#7
  2
Ernyk a dit :
:c n tou a conseguir

Uma área de callback é defenida colocando <a href="event:texto">texto</a>
toda a vez que alguém clicar nessa área, a função eventTextAreaCallback é acionada com os argumentos:
  • o id da text area
  • o jogador que clicou (se for a Maria, o argumento vai ser "Maria")
  • o callback (neste caso será texto, o que define este argumento está selecionado a vermelho)


"Todos" os textos têem de ser "rodeados" com aspas simples ou com aspas duplas, senão vão ser consideradas variáveis

Seleção de aspas simples pode conter naturalmente aspas duplas e vice-versa
Caso a seleção seja com aspas duplas e quer meter uma aspa dupla, vai acabar a seleção por aí, a não ser que antes desse caractere esteja uma barra ( \ )

por exemplo "<a href=\"event:texto\">texto</a>"
e '<a href="event:texto">texto</a>'
Gamedroit
« Citoyen »
1499911800000
    • Gamedroit#3347
    • Profil
    • Derniers messages
    • Tribu
#8
  1
gostei esh mas oque você usou é desnecessário -' se for um simples menu é só fazer isto:

Code Lua

1
2
3
4
5
6
7
ui.addTextArea(1, '<a href="event:mostrarAjuda">Ajuda</a>', nil, 300, 100, 200, 100)

function eventTextAreaCallback(id,name,link)
if link == 'mostrarAjuda' then
print('O jogador tentou abrir o menu de ajuda.')
end
end

a maneira que você fez usando table.unpack ficou muito confuso -q apesar que eu sei que o string.split retorna uma tabela nem todos sabem lidar com tabelas -'
e também usou _G que é outra coisa desnecessária em muitos scripts.

Dernière modification le 1499911980000
Brenower
« Censeur »
1499946060000
    • Brenower#0000
    • Profil
    • Derniers messages
    • Tribu
#9
  1
Mas usar o _G foi necessário ué
Hydroper
« Citoyen »
1499958540000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#10
  0
Contistente3 a dit :
gostei esh mas oque você usou é desnecessário -' se for um simples menu é só fazer isto:

Code Lua

1
2
3
4
5
6
7
ui.addTextArea(1, '<a href="event:mostrarAjuda">Ajuda</a>', nil, 300, 100, 200, 100)

function eventTextAreaCallback(id,name,link)
if link == 'mostrarAjuda' then
print('O jogador tentou abrir o menu de ajuda.')
end
end

a maneira que você fez usando table.unpack ficou muito confuso -q apesar que eu sei que o string.split retorna uma tabela nem todos sabem lidar com tabelas -'
e também usou _G que é outra coisa desnecessária em muitos scripts.

Concordo, mas acho que ele usou a tabela de callbacks por questão de legibilidade do código, porém isso pode ser mais ineficiente na execução — 1) o compilador de Lua não pode alinhar o acesso desses callbacks... 2) LuaJ não faz cache de acessos nas tabelas (de acordo com o código fonte no GitHub).

Dernière modification le 1499958720000
Laagaadoo
« Citoyen »
1499975100000
    • Laagaadoo#0000
    • Profil
    • Derniers messages
    • Tribu
#11
  1
Profiver a dit :
Contistente3 a dit :
gostei esh mas oque você usou é desnecessário -' se for um simples menu é só fazer isto:

Code Lua

1
2
3
4
5
6
7
ui.addTextArea(1, '<a href="event:mostrarAjuda">Ajuda</a>', nil, 300, 100, 200, 100)

function eventTextAreaCallback(id,name,link)
if link == 'mostrarAjuda' then
print('O jogador tentou abrir o menu de ajuda.')
end
end

a maneira que você fez usando table.unpack ficou muito confuso -q apesar que eu sei que o string.split retorna uma tabela nem todos sabem lidar com tabelas -'
e também usou _G que é outra coisa desnecessária em muitos scripts.

Concordo, mas acho que ele usou a tabela de callbacks por questão de legibilidade do código, porém isso pode ser mais ineficiente na execução — 1) o compilador de Lua não pode alinhar o acesso desses callbacks... 2) LuaJ não faz cache de acessos nas tabelas (de acordo com o código fonte no GitHub).

na verdade não importa, luaj é quase tão rápido quanto o lua em C, em alguns casos é mais rápido
Transfor801
« Citoyen »
1611594060000
    • Transfor801#4477
    • Profil
    • Derniers messages
    • Tribu
#12
  0
Muito bom mano valeu aí
Jp_darkuss
« Citoyen »
1611624000000
    • Jp_darkuss#4806
    • Profil
    • Derniers messages
#13
  0
Quando eu queria passa parâmetros eu fazia assim:

Code Lua

1
2
3
4
5
6
7
ui.addTextArea(0, "<a href='event:print(Blá blá blá)'>Clique aqui!</a>", nil, 380, 100, nil, nil, nil, nil, 1, true)
eventTextAreaCallback= function(_, _, event)
if event:match("print") then
local str= event:match(".-%((.-)%)")
print(str)
end
end

Normalmente só uso isso em coisas bem específicas.

@edit: o link não funciona.

Dernière modification le 1611624240000
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] Callbacks de text areas
© Atelier801 2018

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

Version 1.27