sexta-feira, 15 de março de 2013

Aprendendo RGSS do zero - Aula 03

Vamos agora ver as estruturas de controle, que são instruções
de condição, repetição e etc.

- Continuação dos operadores

Você verá muito pela frente operadores de maior que, menor que e igualdade. Eles são muito usados em condições.

Um erro muito comum dos novatos é confundir o operador de atribuição '=' com o de comparação '==', a grande diferença é que o primeiro não é usado em controles de fluxo, é somente usado para atribuir um valor a uma variável e não para comparar com outra ou fazer uma condição.

x = 10  # atribuimos a x o valor 10
x == 10 # comparamos x com 10, se for igual, x = true, senão, x = falso


Os operadores de menor que e maior que são os seguintes:

exp < exp2 # exp menor que exp2
exp > exp2 # exp maior que exp2


Há também os de menor ou igual que e maior ou igual que:

exp <= exp2 # exp menor ou igual que exp2
exp >= exp2 # exp maior ou igual que exp2


E por último o operador diferente de.

exp != exp # falso, exp == exp
20 != 11   # verdadeiro


- Condição

A mais básica e elementar estrutura é a condição, onde simplesmente retorna um valor verdadeiro caso a expressão for verdadeira e falso se ela for falsa.

A sintaxe é a seguinte:

if exp == true
# caso for true, executa este bloco
end

 
Antes de mais nada, na linguagem Ruby, se delimita blocos com a palavra reservada end, justamente para informar o interpretador onde deve ser parado, porque senão tudo abaixo
da condição seria interpretado! Mas lembre-se, não são todas as palavras reservadas que requerem o end!

Retornando à aula, o if pode ser usado também com false:

exp = true && false # false
if exp == false
# ...
end


Quando não fica explícito um valor boolean (true/false), implica-se que o valor é true, ou seja, o valor natural da condição é verdadeiro.

if exp
# caso for verdadeiro
end

 
Há várias formas de escrever uma condição, vamos a elas!

-> Usa-se then caso queira por tudo em uma linha.
if exp == true then exp2 end

-> Há também o operador ternário.
exp == false ? exp2 : exp3

Que seria igual a isto:

if exp == false
# caso for false
else
# caso for verdadeiro
end

 
Também pode ser escrito numa linha após uma expressão.

metodo if exp
msgbox "Teste" if variavel == false


Explicarei o else agora. Ele pode ser traduzido para se não e só pode ser usado com um if pareado, não se pode usar somente ele sem o if, o contrário é possível.

if 10 > 50
# se for verdadeiro
else
# falso será executado este bloco
end


O elsif pode ser traduzido para mas se, ele funciona assim:

if exp == 1
# ...
elsif exp == 2
# mas se exp for igual a 2
elsif exp == 3
# mas se exp for igual a 3
else
# se não for nem 1,2 ou 3
end


Ele serve para evitar o uso excessivo de if.

Há também o unless, que é o contrário do if, ele tem valor de condição falso.

unless 10 == 10
# se for verdade, é igual a if 10 != 10
else
# falso, será executado este bloco
end


Exemplo, vamos a um exemplo prático. Crie um evento e chame o script:

if $game_actors[1].level > 5
   msgbox "level maior que 5"
elsif $game_actors[1].level == 5
   msgbox "level igual a 5"
else
   msgbox "level menor que 5"
end


A variável $game_actors como se vê é global e é uma instância da classe Game_Actors, que por sua vez é uma lista de Game_Actor. O índice 1 indica o primeiro personagem
e o level o atributo nível. Faça um teste modificando o nível do herói e veja o resultado.

- Repetição

Os controles de repetição são extremamente úteis, então tente entendê-los o mais rápido possível.

Começaremos pelo for.

for i in 0...10
    msgbox i.to_s
end


Este código faz com que apareça a caixinha de mensagem 10 vezes, porém o interessante é que cada vez tem um número diferente. Nesse caso usei números, a variável i armazenará 10 vezes, um valor de cada vez, no caso de 0 a 9. Então usamos o método to_s para converter de número para string, por conveniência.

A diferença entre '...' e '..' (operadores) é que o primeiro não vai até o último número, e o segundo sim.

... => 0,1,2,3,4,5,6,7,8,9
..  => 0,1,2,3,4,5,6,7,8,9,10

Podemos também utilizar o for com arrays. Já aproveito para falar um pouco delas.

Declara-se uma array da seguinte forma:

var = []

Uma array ou lista é uma variável que pode armazenar vários valores dentro dela. Vamos a um outro exemplo.

var = [1,2,3,4]

Para nos referirmos a um valor usa-se o operador '[]'. Atenção, o índice começa pelo zero!!

var[0] # => 1
var[1] # => 2
var[2] # => 3
var[3] # => 4

 
Podemos usar o for para varrer cada valor seu, e utilizá-lo na caixinha. Vamos a um exemplo mais elaborado.

for i in var
    msgbox (i*2).to_s
end


O comando next funciona como um pulo dentro do laço, caso tal condição seja alcançada, não será executada tal volta no laço.

ary = [0,2,4,8,16,32,64]
for i in 0...ary.length
  next if i == 2
  msgbox ary[i]
end


Assim aparecerão os seguintes números:
0,2,8,16,32 e 64

- Looping

Uma estrutura de looping é um laço que se repete até que uma condição seja alcançada. Há dois laços, o while e until, basicamente o while é um if o until um unless.

O while funciona da seguinte maneira:

while exp
# executa  o laço até que exp seja falso
end


É muito comum ouvir a expressão laço ou loop infinito pois se não houver mudança na expressão, o laço nunca acabará! Vamos a um exemplo!

ary = [0,2,4,8,16,32,64,128,256,512,1024]
i = 0
while i < ary.length
  msgbox ary[i].to_s
  i += 1
end

 

O método lenght retorna o tamanho do array. Então nesse caso será feito 11 repetições. Perceba a condição do loop, i < ary.lenght e veja que dentro do laço há o incremento de i por 1, isso significa que quando i == ary.lenght (11) o loop irá se quebrar.

Por falar em quebrar, vamos ao comando break

ary = [0,2,4,8,16,32,64,128,256,512,1024]
i = 0
while i < ary.length
  msgbox ary[i].to_s
  i += 1
  break if i == 5
end


O comando break faz o laço parar caso a expressão seja alcançada, nesse caso o loop irá parar se i for igual a 5.

E por fim o until. Ele signifca até que:

i = 10
until i == 0
i = i - 1
end


Funciona como o contrário do while, até que a expressão tenha um valor, será rodado o laço.

- Exemplo prático


Crie um evento e chame o código.

for i in 0...$game_party.all_members.length
    msgbox $game_party.all_members[i].name
end


Será exibida caixinhas com os nomes de todos os personagens do grupo.

Note que all_members é um método da classe Game_Party que retorna um array de Game_Actor.

Como exercício, deixo o exemplo acima, utilizando o while e use o nível ao invés do nome. A resolução virá na próxima aula.

Veremos mais sobre métodos na próxima aula.

Nenhum comentário:

Postar um comentário