Página 1 de 1

[PROG]#IEM Aula 04 - If/While e Expressões

Enviado: Sex Abr 29, 2016 3:07 pm
por All-x

INTRODUÇÃO EM GML

Aula 04 - If/While e Expressões

(Atualizado 08/02/2015)



IF:

É uma estrutura de checagem condicional que em português significa "se". Agora explicarei uma estrutura básica de código usando if:

Código: Selecionar todos

if variavel == 0
{
    variavel2 = 100
}
Tradução:

Código: Selecionar todos

Se variavel é igual a 0 o que esta entre chaves acontece, ou seja, variavel2 igual a 100.
Vamos fazer mais um exemplo simples. O Super Mario tem duas variáveis bem conhecidas, moedas e vidas. Para se conseguir uma vida coletando moedas, tem que conseguir 100 destas.

Baixe a seguinte engine:

[GM:S] DOWNLOAD DA ENGINE

[GM8] DOWNLOAD DA ENGINE

Nela a movimentação do personagem está pronta. Não se preocupe em entender esses códigos de movimento e gravidade, pois nas próximas aulas estarei ensinando a movimentação.

No evento Other>>Game Start do controle coloque:

Código: Selecionar todos

//Número de vidas
global.vidas = 3

//Número de moedas
global.moedas = 0
Ou seja, sempre que o jogo iniciar o personagem terá 3 vidas e 0 moedas.

Agora no step vamos fazer uma checagem de variáveis, e como o step é constante ele sempre estará checando:

Código: Selecionar todos

//Se moedas for maior ou igual a 100
if global.moedas >= 100
{
    //Retira 100 moedas
    global.moedas -= 100
    
    //Ganha uma vida
    global.vidas += 1
}
Você deve ter percebido o uso do ">" neste código, em matemática significa maior que, também tem o "<" (menor que), e adicionamos este símbolo antes do sinal de igual. Explicarei melhor isso mais abaixo, em Expressões.

Colocamos esse operador ali porque se você aumentar o número de moedas muito rápido, global.moedas pode passar de 100. Se fosse "if global.moeda =100..." o código não funcionaria bem, pois só se fosse exatos 100 que a outra expressão aconteceria.

Na engine tem um objeto chamado "moeda", cuidado!!! Nunca de nomes de variáveis e objetos e qualquer outro elemento(background, sprite, sons, rooms, fonts, paths e etc) iguais, senão acontecerão erros. Ex: você não pode dar o mesmo nome a uma sprite e a um objeto.

Então você percebeu agora, porque a variável se chama "global.moedas" e o objeto "moeda"?

Nesse objeto moeda adicione o evento Collision e selecione o objeto player e coloque o seguinte código:

Código: Selecionar todos

global.moedas += 1

instance_destroy()
Ou seja, ganhamos 1 moeda e a instancia de objeto moeda será destruída quando colidir com o player.

Agora para vermos as variáveis vamos ao objeto controle para desenhar as nossas variáveis. Sempre use um objeto separado para desenhar coisas como pontuação, vidas e etc.

No evento Draw do objeto controle abra o editor de códigos e coloque o seguinte código:

Código: Selecionar todos

draw_text(10,10,"Vidas: " + string(global.vidas) + "#" + "Moedas: "+string(global.moedas))
Esse código desenha as variáveis global.vidas e global.moedas.

Quando for desenhar textos sempre os coloque-os entre aspas "texto". E ja que estamos desenhando textos, tivemos que converter valores reais (números) em strings (palavras) usando a função string(str).

"#" serve para pular uma linha. E sempre que for adicionar mais de um texto e mais de uma variável intercalados usa-se o  somando seus valores para formar um novo texto.

Agora testem suas engines, para ver como saíram os resultados. Caso tenha saído algo errado baixe esta outra engine que esta completa:

[GM:S] DOWNLOAD DA ENGINE

[GM8] DOWNLOAD DA ENGINE

WHILE:

while é quase igual ao if, só há uma diferença:

Imagine todo o jogo como um ciclo que ocorre infinitamente. Quando esse ciclo passa pelo if  ele faz a checagem normalmente, independente se a condição for verdadeira ou não e continua sem interromper esse ciclo.

Já quando o ciclo passa pelo while (que é um ciclo também), o ciclo pausa até que a condição vinculada a ele seja falsa. Exemplo:

- Crie um novo projeto.
- Adicione um novo objeto e um nova room.
- No Create do objeto coloque:

Código: Selecionar todos

moeda=0

if moeda < 100
{
    moeda += 1
}
-No Draw coloque (para sabermos o valor final da variável moeda):

Código: Selecionar todos

draw_text(10, 10, moeda)
- Insira o objeto na room e execute.

O valor da variável moeda mostrado é 1. Isso porque o Create ocorre apenas uma vez no inicio do ciclo do objeto e só deu tempo de checar a condição uma única vez.

- Agora troque o IF por WHILE e execute novamente.

Repare que:

- A tela fica preta por alguns instantes (Essa é a pausa no ciclo principal do jogo, aguardandoo ciclo while acabar).
- O valor de moeda agora é 100.

Ou seja, o while segurou o Create até que a variável moeda não fosse mais menor que 100.

Muito cuidado ao usar o while, se a condição nunca ficar falsa o jogo vai ficar travado.

EXPRESSÕES:

Vimos que para if e while funcionarem, antes eles checam uma condição para que o que está dentro das chaves ocorra.

Essa condição é uma expressão. As que usamos até agora foram simples, mas há formas de checar mais de uma condição em uma mesma expressão, e ainda usar uma expressão em uma operação aritmética.

Para que fique tudo mais organizado, pegue o costume de usar parenteses nas suas condições. Ex:

if (moedas >= 100) ...

A nossa expressão é (moedas >= 100), ela retorna 1 (true) ou 0 (false) para o if. Ou seja um valor booleano.

Operadores de comparação:

> maior que
< menor que
>= maior ou igual que
<= menor ou igual que
== igual a (É diferente de apenas =, que  significa atribuição)
!= diferente de

Agora vamos as expressões compostas:

AND:

Código: Selecionar todos

if ( (energia > 50) and (arma == 3) )
{
    energia -= 50
}
Nesse código a ação só acontece se duas condições forem satisfeitas, ter mais de 50 de energia e a arma ser 3. Se uma das duas for falsa a ação não ocorre. Usamos o operador and que faz com que dois lados de uma condição tenham que ser verdadeiros para a ação ocorrer.

OR:

Código: Selecionar todos

if ( (cor == c_red) or (cor == c_orange) )
{
    cor_quente = true
}
Nessa expressão é necessário que apenas uma condição seja verdadeira para que a ação ocorra. Usamos o operador or que faz com que pelo menos um dos lados de uma expressão tenha que ser obrigatoriamente verdadeiro para a ação ocorrer.

Como vimos expressões nos devolvem 1 ou 0 como valor. Podemos usar isso para simplificar códigos:

Código: Selecionar todos

x += (anda == true) * 5;
Ou seja, caso anda ter o valor 1 o objeto vai mudar de posição em +5. Repare também que estou usando "== true" nas expressões. Na verdade se eu quero verificar se ela é verdadeira, não preciso adicionar nada. Dai o código seria:

Código: Selecionar todos

x += (anda) * 5;
Obteremos o mesmo resultado. É a mesma coisa com o exemplo das moedas. Se eu quisesse poderia ter feito assim:

Código: Selecionar todos

if ( moedas >= 100 ) == true
{

}
Só que é desnecessário checar se ela é "verdade é verdadeira", sacaram? Mas quando queremos checar se a expressão é falsa não devemos omitir o  "== false".

Enfim terminamos mais essa!

Aula Anterior: #IEM Aula 03 - Operações matemáticas
Próxima aula: #IEM Aula 05 - Else e Switch

FLWS!