Forums » RGSS

Lição 6 - Retornando à sintaxe - Condições

    • 683 posts
    2 de junho de 2015 18h06min33s ART

    Tenho visto muitos posts em meus D&T me comparando com outras pessoas e comparando o que eu ensino com o que já existe. Bem... O Grande Mestre Vagner me deu este espaço para que VOCÊ aprenda, eu disponho do meu tempo para estar aqui escrevendo para que você saiba um pouco mais sobre programação, não só RGSS, porque programar, mesmo que em linguagens diferentes, exige-se os mesmos conceitos e regras.

    Hoje o Assunto vai ser bem chato, vamos deixar um pouco de lado os exemplos e vamos falar de Sintaxe. Você já viu nas aulas anteriores o uso de uma condicional. Hoje falaremos sobre as condicionais mais usadas no RGSS.

    CONDICIONAIS:

    1º Estrutura - If e Unless

    O próprio nome já diz. Para quem está habituado às condições dos eventos, já sabe mais ou menos como funciona. A estrutura principal é esta:

    if then 

    else 

    end

    No Ruby, o  then é dispensável na maioria dos casos.

    IF, THEN, ELSE ??


    Pra quem não sabe inglês, é mais ou menos assim:

    if = SE
    then = ENTÃO
    else = SENÃO


    Então é possível entender que uma Estrutura condicional faz uma pergunta, se ela for respondida, ocorre algo, se não, ocorre outra coisa.
    Seria assim:

    Se == "Amarelo" então
    <"A laranja é amarela">
    senão
    <"Desde quando uma laranja é amarela?">
    fim


    As condicionais são variantes, ou seja, sua estrutura pode ser mudada, por exemplo, podemos contruir uma condição sem else, por exemplo:

    if $game_switches[1] == true
    print "ok"
    end

    A condição acima vai mostrar o texto somente quando a Sw 1 estiver ligada.

    if $game_variables[1] == 50
    print "50"
    end

    A condição acima vai mostrar o texto somente quando a var 1 tiver o valor igual a 50.

    Com certeza você vai ter minhares de dúvidas... 
    Como testar isso? 
    Como saber se isto é verdade? 
    Porque as comparações usando Sws e vars?

    Eu pretendo ir introduzindo o uso das Sws e Vars internas do RMXP nas nossas aulas, para que você veja que 
    "TUDO QUE OS EVENTOS FAZEM, NADA MAIS SÃO QUE EXECUÇÕES DE SCRIPTS."

    Vamos exemplificar...
    Quando você faz uma condicional num evento, como o da imagem abaixo:



    Internamente o RMXP está fazendo isso:

    if $game_switches[1] == true
    <>
    end


    Se você mudar o "Adicionar Exceção.." fica assim:

    if $game_switches[1] == true
    <>
    else
    <>
    end


    Se você está habituado aos eventos, você já reconheceu a estrutura...



    As condicionais são de extrema importância na programação, pois são elas que nos ajudam a tornar o código mais dinâmico. com as condicionais, você muda valores, aceita ou não que coisas tenham sido feitas no jogo ou simplesmente impede que algo aconteça, se a determinada condição não for verdadeira.
    Olhe esta parte de código retirada do RMXP:



    Este texto vem do menu principal. observe que o if questiona o pressionamento de uma tecla(Input.trigger?(Input::B)). Observe também que não há else. Significa que o que está neste if só vai funcionar quando a tecla for pressionada, caso contrário não ocorrerá nada. A caixa vermelha mais escura mostra o procedimento principal se caso a tecla for pressionada.

    Logo abaixo eu mostro outro questionamento de teclas, que neste caso tem outro if dentro dele.

    Até agora vimos que eu a condição if verifica se um valor é verdadeiro e, se na estrutura houver um else, faz com que a resposta não verdadeira à condição também resulte numa ação. Mas e se eu quiser que hajam mais clausulas, ou que sejam mais restritas as minhas condições ??

    Para mais clausulas, acrescentamos na estrutura o elsif. O elsif permite que tenhamos mais de uma clausula verdadeira em nossa estrutura. Vamos exeplificar:

    if $game_variables[1] == 1
    <>
    elsif $game_variables[1] == 2
    <>
    elsif $game_variables[1] == 3
    <>
    else
    <>
    end


    Desta forma, podemos ter vários resultados dependendo do valor de $game_variables[1]. 
    elsif é uma fusão de else e if, que significa MAS SE.
    Por Exemplo:

    Se == "Amarelo" então
    <"Minha Brasília é Amarela">
    Mas se == "Preto"
    <"Fuscão Pretooo...">
    Mas se == "Azul"
    <"Minha Belina é Azul, e daí?">
    senão
    <":( Eu não tenho carro...">
    fim


    Exemplos a parte, acho que foi possível entender como ampliar a estrutura if. Mas e para aumentar a restrição das clausulas ??
    Existem palavras reservadas que são exatamente para isso. elas são:

    and
     - (e) Significa que depende de uma de da outra clausula
    or - (ou) Significa que é uma OU outra clausula

    Qualquer uma das RW acima pode ser usada junto com a RW not - (não), para especificar que é uma e não a outra e que é uma ou não a outra, por exemplo:

    if $game_variables[1] == 1 and $game_variables[2] == 3
    <>
    elsif $game_variables[1] == 2 or $game_variables[2] == 3
    <>
    elsif $game_variables[1] == 3 and not $game_variables[2] == 4
    <>
    elsif $game_variables[1] == 3 or not $game_variables[2] == 5
    <>
    else
    <>
    end


    Podemos ver que vai tornando bem vasta nossa condição.
    Vamos aprender um pouco de matemática do RGSS agora...  ::)
    Você já deve ter se perguntado porque eu uso dois sinais de igual (==) nas clausulas do if. Para o RGSS, essa é a forma de comparar valores. Pra quem gosta de matemática (como eu) deve se lembrar de alguns dos símbolos matemáticos usados pelo RGSS:

    == - (igualigual) compara se os valores são iguais.
    <= - (menorigual) Compara se o primeiro é menor ou igual ao segundo.
    >= - (maiorigual) Compara se o primeiro é maior ou igual ao segundo
    != - (diferente) Compara se o primeiro e o segundo são diferentes.

    Com isso, podemos ampliar mais ainda nossa estrutura, recebendo apenas a resposta que precisamos. veja o exemplo:

    if $game_variables[1] == 1 and $game_variables[2] == 3
    <>
    elsif $game_variables[1] == 2 or $game_variables[2] == 3
    <>
    elsif $game_variables[1] == 3 and not $game_variables[2] == 4
    <>
    elsif $game_variables[1] == 3 or not $game_variables[2] == 5
    <>
    elsif $game_variables[1] == 2 or $game_variables[2] <= 3
    <>
    elsif $game_variables[1] <= 3 and not $game_variables[2] >= 4
    <>
    elsif $game_variables[1] >= 3 or not $game_variables[2] != 5
    <>
    elsif $game_variables[1] != 3 or not $game_variables[2] == 5
    <>
    else
    <>
    end


    É... As possibilidades se tornam infinitas. E você deve estar se perguntando...

    "EU PRECISO MESMO SABER ISSO PRA PROGRAMAR EM RGSS ??"


    A resposta é sim. variáveis, classes, condições, repetições é o que faz com que a programação funcione.

    Você deve se lembrar de uma condicional que foi usada na nossa primeira janela, era essa:

    @ator == 3 ? @ator = 0 : @ator += 1


    Veja que a estrutura não usou nenhuma palavra, apenas sinais. é uma forma rápida de se fazer uma condição de alteração de valores. Veja que é perguntado a var em questão se o seu valor é igual 3. Se for, ele torna a var igual a 0(zero), se não, ele adiciona mais 1(um) a ela. Neste caso, a ? funciona como um then, e os : como um else.

    Já que falamos sobre o not, vamos falar de um if diferente. A palavra reservada unless serve como um if ao contrário. o if espera um resultado verdadeiro, já o unless um resultado falso. usar unless e usar if not é a mesma coisa, com as mesmas clausulas e procedimentos. Nem vou dar exemplos, o uso do unless é bem simples e se restringe a apenas "aceitar um não como resposta".

    2º Estrutura - Case

    A estrutura case asemelha-se ao if, pelo fato de também ser uma comparativa, e pelo fato de retornar apenas um resultado. A estrutura é essa:

    case
    when
    <>
    when
    <>
    when
    <>
    else
    <>
    end


    No caso do Case, Declaramos a condição e as clausulas when - (Quando) é que comparam os valores. A diferença principal entre o if e o case é que no caso do case não é possível o uso de and e or e nem os fazer comparações matemáticas. Ou o resultado está nos when(gera uma ação), ou não está, e não gera nada. No case é possivel usar o else também, no caso das exceções. Observe este exemplo do RGSS:




    Este código foi retirado da classe Game_Player, e se refere ao movimento do herói. Repare que o case é diretamente no Input.dir4, que é a classe se teclas.direcionais. nos when, os valores das direções e, dentro deles, o que vai acontecer quando a condicional for verdadeira.

    Mas qual a vantagem de se usar if ?? 
    E qual a vantagem de se usar case ??

    O if nos permite uma gama maior de clausulas em nossa condição, mas torna o código lento, pois o RGSS analiza cada condição da estrutura para saber a qual delas ele deve responder. No caso do case, ele tem menos código para ler, pois ele sabe que o case vai apenas comparar o valor principal(declarado no case) com os valores declarados nos when.

    O material sobre o case foi um pouco mais curto, na realidade tudo que é necessário saber sobre ele foi dito.

    CONCLUSÃO:

    Hoje demos uma leve pincelada nas estruturas de condição. Há muito o que ver sobre estas e, para o nosso caso, não há necessidade de aprofundamento. Eu queria falar nesta aula sobre as estruturas de repetição, mas o post tá meio extenso e meu tempo meio curto. Eu não dei nenhum exercício hoje, porque é necessário falar um pouco de teoria antes de entrarmos no assunto principal do RGSS, o qual eu tenho certeza que muitos estão esperando... As Scenes. Somente depois de falarmos sobre as estruturas de repetição eu entrarei neste assunto, que eu tenho certeza vai gastar umas 3 aulas...

    Até a próxima.  ;D