Conectar-se
Quem está conectado
18 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 18 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Data de inscrição : 18/12/2013
Número de Mensagens : 176
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 6

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuáriohttp://donutscore.com

Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 19:32
Pessoal, aprendi como usar o switch e fui criar meu menu, no codigo abaixo, sempre que eu selecionava a primeira opção, todas as outras abaixo dele eram executadas uma apos a outra.
Código:
if (keyboard_check_pressed(vk_enter))
    {
    var option;
    option = scr_menu_current(items,ind);
    switch (option)
        {
        case 0:
            room_goto(roo_start);
        case 1:
            show_message("teste");
        case 2:
            show_message("teste");
        case 3:
            show_message("teste");
        case 4:
            show_message("teste");
        case 5:
            show_message("teste");
        case 6:
            show_message("teste");
        case 7:
            show_message(ds_list_find_value(items,option));
        case 8:
            if (show_question("Tem certeza de que deseja sair?"))
                {
                game_end();
                }
        break;
        }
    }

Não entendo muito bem como funciona o switch alguém poderia me explicar? Resolvi mudando o codigo para else-if e eagora está normal, mas acredito que o switch era para funcionar no exemplo acima, enfim com o codigo abaixo não tem mais erro.
Código:
if (keyboard_check_pressed(vk_enter))
    {
    var option;
    option = scr_menu_current(items,ind);
   if option = 0
      {
      room_goto(roo_start);
      }
   else if option = 1
      {
      show_message("teste");
      }
   else if option = 2
      {
      show_message("teste");
      }
   else if option = 3
      {
      show_message("teste");
      }
   else if option = 4
      {
      show_message("teste");
      }
   else if option = 5
      {
      show_message("teste");
      }
   else if option = 6
      {
      show_message("teste");
      }
   else if option = 7
      {
      show_message(ds_list_find_value(items,option));
      }
   else if option = 8
      {
      if (show_question("Tem certeza de que deseja sair?"))
            {
            game_end();
            }
   }
    }

Obrigado  pig
avatar
Ranking : Nota C
Notas recebidas : C
Data de inscrição : 07/09/2010
Número de Mensagens : 1400
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 21

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 19:38
Ahn... No fim de cada case, você tem que por um break.
Ranking : Nota C
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6037
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 288

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 20:25
O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.
avatar
Ranking : Nota C
Notas recebidas : C
Data de inscrição : 07/09/2010
Número de Mensagens : 1400
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 21

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 20:35
@PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam
avatar
Data de inscrição : 02/10/2009
Número de Mensagens : 2227
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 52

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 20:38
Reputação da mensagem: 100% (1 votos)
@Mr. Kaleb escreveu:
@PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam
Exato.
avatar
Data de inscrição : 18/12/2013
Número de Mensagens : 176
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 6

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuáriohttp://donutscore.com

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 22:44
Obrigado a todos, agora sim entendi porque o código era executando até o final. (Coisas de iniciantes Smile
avatar
Ranking : Nota A
Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Número de Mensagens : 1846
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 254

Prêmios
   : 2
   : 1
   : 1
Ver perfil do usuáriohttp://willy-gmbr.blogspot.com/

Re: Duvida sobre Else-if e Switch

em Seg 17 Mar 2014, 23:44
@Gabreel escreveu:
@Mr. Kaleb escreveu:
@PedroX escreveu:O case é como o if e o break faz o papel do else. Só que switch é mais eficiente que if-else.

Só complementando, é mais eficiente para a execução, porque quando o switch checa a ação correta, ele para de checar o resto, já o if-else checa todo o programa. É isso mesmo? Só queria dar um adendo, se estiver errado, me corrijam
Exato.
Errado!
O if else não checa todas as condições. Por isso é importante fazer uma estruturação de checagem, desde a mais completa até a mais básica, por exemplo:


Código:
if (Var1=10 && Var2=20 && Var3=30){
//Ação
}else if (Var1=10 && Var2=20){
//Ação
}else if (Var1=10){
//Ação
}

Se as 3 condições forem atendidas, o primeiro "//Ação" é executado, se apenas 2 forem atendidas, o segundo é executado, se for apenas 1, o terceiro.
Entretanto, se eu fizer a mesma checagem de forma oposta:
Código:
if (Var1=10){
//Ação
}else if (Var1=10 && Var2=20){
//Ação
}else if (Var1=10 && Var2=20 && Var3=30){
Ação
}
Neste caso, mesmo que a terceira condição for verdadeira, apenas a primeira será executada.

Agora, em questão de desempenho, não que seja muito significativo, switch é mais rápido.
Ranking : Nota C
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6037
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 288

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: Duvida sobre Else-if e Switch

em Ter 18 Mar 2014, 15:00
Só para complementar um pouco, já que todo mundo está fazendo isso:

Código:
if (a==1 && b==0)
{
// BOOM!
}

No GM:8 e em versões antigas do GM:S, acontecia o seguinte:

http://www.yoyogames.com/tech_blog/52[/mention] escreveu:Now, previously when using GameMaker: Studio, that “if” would evaluate both parts, checking the value of val1 (a) and val2 (b), even if val1 (a) had evaluated as false. This is obviously not optimal, since sometimes you may want to evaluate several values, and those values could be derived from expensive functions etc... which will make them more costly to run.
Resumindo, o GM verificava a expressão inteira, para depois decidir se executava ou não o código. Com funções lentas, isso poderia deixar o jogo lento. Veja:

Código:
if (0>1 && draw_get_pixel(10, 10) == c_red)
{
// isso não vai ser executado
}

Como 0 não é maior que 1, o código não será executado. Mas a função draw_get_pixel (que é bem lenta) seria executada mesmo assim.

Por isso, é bom usar ifs sequencialmente.

Código:
if (0>1)
if (draw_get_pixel(10, 10) == c_red) //essa condição não será testada
{
// isso também não será executado
}

A diferença é que o GM vai ver que 0 não é maior que 1 e já vai parar por aí.

Agora o Short-circuit evaluation foi implementado. Ou seja, se você usar o GM:S, pode usar o && sem medo, porque a expressão deixa de ser interpretada logo no primeiro false retornado.
Conteúdo patrocinado

Re: Duvida sobre Else-if e Switch

Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum