Ir para conteúdo

Tprocheira

Posts Recomendados

Fala galerinha do XTibia.com!
Como tenho visto poucos tutoriais de nível avançado na nossa sessão de scripting, decidi fazer este tutorial completo sobre loops em LUA.
Basicamente, existem 3 tipos de loops que podem ser usados, os quais são: repeat ... until, while e for.
Recomendações:
-Conhecimento completo sobre Arrays;
-Conhecimento intermediário sobre LUA OFF-OpenTibia

Repeat Loop
Este é raro de se ver, já que ele tem uma sintaxe maior e faz a mesma coisa que o while.
A sua sintaxe é a seguinte:

local var = 0


function bla()
repeat
script
var = var+1
until var == 10
end
end


Este tipo de loop funciona da seguinte maneira:
Você tem uma variável para a qual você atribui o valor 0.
Então, você da o comando repeat, o qual irá repetir o código.
Para que o loop não seja infinito, você terá que adicionar a linha until var == valor, e antes disso, algo que aumente o valor da variável, no nosso caso, foi usado var = var+1, o que, após o script ter sido executado, irá aumentar o valor da variável var em um.
Um exemplo de OpenTibia:

local var = 0function onUse(cid, item)local rand = math.random(1, 10)repeatdoPlayerSay(cid, rand, 2)var = var+1until var == 5return trueend


Isso fará com que o player fale um número qualquer (randomizado pelo math.random) até que a variável var tenha valor 5.
Como pôde perceber, esse tipo de loop é um pouco complicado, já que você tem que aumentar a variável e para se fechar o loop você precisa colocar uma 'função' (until var == 5) para que ele termine.

While Loop
Esse, mesmo que pouco usado, ainda é usado atualmente.
Ele funciona quase da mesma maneira que o repeat, a não ser pelo fato de que não existe o until var == valor.
A sua sintaxe é a seguinte:

local var = 0


function Bla()
while var < 5 do
script
var == var+1
end
end


Neste caso, você terá que adicionar um end no lugar do until, mas percebam que ainda é preciso usar o var == var+1.

Um exemplo de OpenTibia:

local var = 0function onUse(cid, item)while var < 5 dodoPlayerSay(cid, "I'm crazy!", 2)var == var+1endend


Este script fará com que o player fale I'm Crazy 5 vezes (ou até a varíavel var estar com o mesmo valor citado no início do loop).
Você pode usar ele para criar um script após o final do while. Por exemplo, depois que ele falar as 5 vezes, ele morrerá de cansaço.

For Loop
Este, na minha opinião pessoal, é o melhor e mais flexível tipo de loop em LUA, porém não funciona com nenhuma condição (ele simplesmente vai repetir até o valor estipulado).
Com ele, você consegue checar cada item de uma tabela, podendo ser nomes, posições, ou qualquer outra coisa.
A sua sintaxe é uma das mais fáceis:

function Bla()


for index = a, b do
print("Hey, you there!")
end
end


Você pode substituir a palavra index por qualquer outra coisa.
Para determinar o valor inicial e o valor máximo à ser usado, você troca a letra a pelo valor mínimo e b pelo valor máximo.
Caso você queira checar cada item de uma tabela, você fará da seguinte maneira:

local table = {"Me", "You", "They"}


function Bla()
for i = 1, #table do
print(i)
end
end


Isso vai exibir na tela do usuário as seguintes palavras:

Me


You
They


Você pode usá-lo para repetir algum código.
Por exemplo, caso você queira esvaziar a sua array sem ter que 'chutar' quantos valores ela vai ter e sem repetir o código, o que você pode fazer, é usar o loop!

local names = {"Me", "You", "He"}function Bla()for i = 1, #names dotable.remove(names, i)endend


Isso irá remover todos os nomes da tabela, sem ter que repetir o código!

Um exemplo de OpenTibia:
20 Itens dentro de uma backpack!

Você também pode parar o loop após ele ter efetuado a sua ação, tudo que você tem à fazer, é adicionar o comando break (quebrar) após o seu código.

Um exemplo muito interessante (não é de minha autoria, e sim de Colandus), é um script que checa uma área e atribui um valor à uma variável se estiver (o tile) vazio ou com algum player.

local position = {fromx = 584, fromy = 371, tox = 595, toy = 381, z = 7}local area = ""function onUse(cid, item, frompos, item2, topos)area = "Creatures at area:\n"for i = position.fromy, position.toy dofor j = position.fromx, position.tox dolocal pos = {x = j, y = i, z = position.z, stackpos = 253}local getThing = getThingfromPos(pos).uidif isCreature(getThing) == 1 thenarea = area .. "1 "elsearea = area .. "0 "endendarea = area .. "\n"enddoPlayerSendTextMessage(cid, 17, area)return 1end



Você também pode usar Iterators com um loop for.
Para isso, farei um tutorial mais tarde!

\\

Editado por Mudrock
Link para o comentário
Compartilhar em outros sites

Se separam itens em uma lista com uma vírgula (não reticências).

Aquilo teve o sentido de mostrar o que faz parte da sintaxe do loop.

Caso você não tenha percebido, os loops while e for não possuem dois comandos, como o repeat tem...

 

\\

Link para o comentário
Compartilhar em outros sites

  • 1 month later...
  • 2 weeks later...
  • 2 months later...

Os primeiros são mais usados em verificações boleanas.

repeat-until é a mesma coisa que do-while em outras plataformas; sua diferença pro while é que ele primeiro executa a ação, depois verifica a condição:

local query = db.getResult("select * from database")
repeat
print(query:getDataInt("column1"), query:getDataString("column2"))
until not query:next() --Fará o ponteiro interno da resouce avançar, se não avançar para

Que seria a mesma coisa que:

local query = db.getResult("select * from database")
while (true) do --Loop infinito
print(query:getDataInt("column1"), query:getDataString("column2"))
if (not query:next()) then break end --Fará o ponteiro interno da resouce avançar, se não avançar para
end

Sendo o modo repeat-until menor e esteticamente correto. :)

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...