Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Porque a cor verde está repetindo duas vezes?

Eu estou fazendo o código para criar bolinhas coloridas na tela, sendo que, a cada vez que se aperta o botão direito do mouse, essas bolinhas mudam de cor. Tudo funcionou para fazer as bolinhas azuis e verdes, porém, ao fazer as vermelhas, aparecem duas dessa cor seguidas antes de retornar à primeira cor (azul). Por que isso está acontecendo?

<canvas width="600" height="400"></canvas>

<script>
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'grey';
    pincel.fillRect(0, 0, 600, 400);

    var cores = ['blue','green','red'];

    var corAtual=0;

    function mudaCor() {  
   if (corAtual<cores.length) {
    cores[corAtual] ;  
    corAtual++; 
} else {corAtual = 0;

}
   return false;
}

tela.oncontextmenu = mudaCor;

    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cores[corAtual];
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }

    tela.onclick = desenhaCirculo;




</script>
6 respostas

Carlos Henrique, se você alterar a maneira de escrever a função, vai funcionar sem repetir cores:

    function mudaCor() {  

    cores[corAtual] ;  
    corAtual++; 

    if (corAtual>=cores.length) {
        corAtual = 0;

}

Não consegui encontrar uma explicação teórica, mas lembro de ter visto em algum momento que existe um laço de repetição que tem a característica de executar a instrução uma vez mais depois que atinge a condição estabelecida como parâmetro. Talvez o motivo esteja relacionado a isso. Vamos ver se aparecem outras sugestões. Bons estudos!

Leila, pelo que parece o problema está com o if else, já que quando se faz 2 if funciona normalmente.Apesar de o if else somente funcionar se deixássemos o código assim:

   function mudaCor() {  
   corAtual++; 
   if (corAtual<cores.length) {
    cores[corAtual] ;  

} else {corAtual = 0;

}
   return false;
}

tela.oncontextmenu = mudaCor;

Vamos ver se alguém sabe uma explição teórica para isso. Obrigado pela sua sugestão.

Eu fiz um teste colocando "- 1" depois do length e resolveu o problema de repetir cor:

function mudaCor() {  
     if (corAtual<cores.length - 1) {
      cores[corAtual] ;  
      corAtual++; 
} else {corAtual = 0;

}
   return false;
}

Mas, continuo sem saber explicar o por quê...

É verdade, nesse caso resolveria oproblema de repetir cor ,porém colocando esse trecho de código que você botou agora, somente fica azul e verde. No caso, teria que tirar o -1 do cores.length, já que ao invés de contar 3 cores do array 'cores', conta somente os 2 primeiros.

Mais especificamente :

cores.length = 3

passaria para

cores.length =2

, ou seja , do jeito que vc colocou corAtual<2 , e não corAtual<3, sendo que na situação que eu coloquei teriam 3 cores, portanto a cor vermelha ( a última do array, teria o índice 2).

Leila, caso algum de nós dois não ache a solução, eu acho que seria uma boa ideia postarmos essa dúvida de novo no fórum, para chamar a atenção do pessoal do scubateam, ou de outra pessoa que saiba porque isso acontece.

solução!

isso acontece porque o corAtual++; esta dentro do IF, mas ele precisa ficar fora, no caso em cima, assim;

function mudaCor() {
        corAtual++; 
       if (corAtual < cores.length) {
        corAtual[cores] ;         
    }   else {corAtual = 0;

    }
       return false;
    }

Primeiro a gente troca ao clicar depois ele checa se ainda é menor. Se não ele conta um índice a mais e continua sendo vermelho

Quando tem dois ifs, como no caso abaixo, parece que raciocínio é parecido, quanto a parte de trocar e depois conferir. Acho que agora ficou mais claro! Obrigado Lucas! Deixo aqui o trecho do código:

function mudaCor() {
        corAtual++; 
       if (corAtual < cores.length) {
        corAtual[cores] ;         
    }   if (corAtual>=cores.length) {

    corAtual = 0;
    }
       return false;
    }