1
resposta

Gostaria de tirar a duvida das três maneiras

Gostaria de entender o raciocinio dos 3 modos:

01-

    var x = 20;
    var sentido = 1;
    function atualizaTela() {
        limpaTela();
        if( x > 600) {
            sentido = -1;
        } else if (x < 0) {
            sentido = 1;
        } 
        desenhaCirculo(x, 20,10);
        x = x + sentido;
    }
    setInterval(atualizaTela, 1);

02-

  function limpaTela(){
        pincel.clearRect(0, 0, 600, 400);
    }
    var funciona = true;
   function pong(){
        limpaTela();
        desenhaCirculo(x, 20, 15);
         if(funciona){
              x++;
            }
                if(x == 580){
                  funciona = false;
                }
                    if(funciona == false){
                      x = x - 1 ;
                    }
                         if(x <= 20 ){
                              funciona = true;
                           } 
      } 
    setInterval(pong, 1);

03

   }

    var x = 20;
    var ida = true;

    function atualizaTela(){
        limpaTela();
        desenhaBolinha(x,20,10);

        if(ida && x < 590){
            x++;
        }
        else if(x > 10) {
            ida = false;
            x--;
        } else{
            ida = true;
        }
}  

       setInterval(atualizaTela,10);
1 resposta

Olá, Italo! Tudo certo?

Muito bacana que você trouxe três possíveis soluções para o mesmo problema. Vamos então analisá-las?


Primeiro caso:

Inicialmente, a função atualizaTela() é chamada a cada 1 milissegundo, conforme a atividade de setInterval(). Toda vez que isso ocorre, a tela é limpada e então iniciamos um bloco condicional:

  • Caso a posição x (horizontal) da bolinha seja maior que 600 (valor estipulado para a largura da tela), nós invertemos o sentido de seu movimento atribuindo o valor 1 à variável sentido:
if( x > 600) {
    sentido = -1;
}
  • Caso essa condição não seja verdadeira, realizamos uma nova verificação. Desta vez, veremos se o valor de x é inferior a 0. Se sim, invertemos novamente o sentido do movimento da bolinha (atribuindo o valor 1 à variável sentido):
else if (x < 0) {
  sentido = 1;
}
  • Caso nenhuma das condições acima seja verdadeira, o sentido da bolinha permanece o mesmo (direita ou esquerda) e ela é desenhada em tela.

Vale ressaltar que, sempre que a função atualizaTela() é executada, ao final do bloco alteramos o valor da posição x. Se o valor da variável sentido for negativo, estaremos diminuindo o valor de x e a bolinha é deslocada para a direita. Oposto a isso, se o valor da variável sentido for positivo, a bolinha tem seu valor horizontal acrescido e, portanto, migra para a direita.


Segundo caso:

Destaco que a execução deste segundo código depende da inicialização da variável x fora das funções:

function limpaTela(){
    pincel.clearRect(0, 0, 600, 400);
}

function pong(){
    limpaTela();
    desenhaCirculo(x, 20, 15);
    if(funciona){
        x++;
    }
    if(x == 580){
        funciona = false;
    }
    if(funciona == false){
        x = x - 1 ;
    }
    if(x <= 20 ){
        funciona = true;
    } 
} 

var x = 20;
var funciona = true;
setInterval(pong, 1);

O modo pelo qual este código funciona é similar ao primeiro. Inicialmente, teremos a variável funciona, a qual irá determinar o sentido que a bolinha tomará.

Quando executamos a função pong(). Teremos uma sequência de verificações:

  • Se a variável funciona possui o valor true, então o valor da bolinha aumentará com o tempo;
if(funciona){
  x++;
}
  • Se o valor da variável x for igual a 580, significa que o limite (largura da tela) foi atingido. Desta forma, a variável funciona passará a ter o valor false ;
if(x == 580){
  funciona = false;
}
  • Se a variável funciona possui o valor false, teremos o decréscimo do valor da posição x da bolinha;
if(funciona == false){
  x = x - 1 ;
}
  • Se a variável x for menor ou igual a 20, significa que o limite inferior foi atingido e x precisa voltar a crescer. Então tornamos funciona igual a true novamente.
if(x <= 20 ){
  funciona = true;
}

Terceiro caso:

Esta última possibilidade é, de certa maneira, uma união das duas formas vistas anteriormente! Bacana, não acha?

Quando entramos na sequência de condições da função atualizaTela(), teremos algo assim:

  • Se o valor da variável ida for igual a true e o valor de x for menor que 590 (tamanho máximo estipulado para a tela), a condição é verdadeira e, por esse motivo, o valor de x é acrescido.
if(ida && x < 590){
      x++; // somando valores à x
}
  • Caso a condição analisada seja falsa, é verificado se o valor de x é superior a 10. Se sim, a variável ida recebe false e o valor de x é diminuído;
else if(x > 10) {
    ida = false;
    x--;
}
  • Por fim, caso nenhuma das condições seja verdadeira, é atribuído à variável ida o valor true, recomeçando o ciclo de verificações após a chamada da função.
else {
    ida = true;
}

Bastante coisa, não é mesmo? Por isso, caso tenha dúvidas com relação à minha explicação ou também ao longo dos seus estudos, sinta-se confortável para perguntar o que for preciso no fórum!

Até mais e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.