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

Por que a segunda bandeira leva o dobro do tempo em tela?

No código abaixo eu até consegui atingir o propósito de alternar entre as bandeiras, porém a bandeira da Alemanha leva o dobro do tempo em tela do que a bandeira do Brasil.

Eu consegui corrigir o código posteriormente, e atingi o objetivo do exercício (testei separadamente o valor do timerA em outro if, aí deu certinho 3 segundos pra cada bandeira), mas eu gostaria de entender melhor como o meu primeiro código era executado, e por qual razão a bandeira da Alemanha levava o dobro de tempo na tela.

se alguém puder me explicar, por gentileza ^^

<!-- bandeiras.html -->

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

<script>

function desenhaBandeiraBrasil() {
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle="green";
    pincel.fillRect(0, 0, 600, 400);

    pincel.fillStyle="yellow";
    pincel.beginPath();
    pincel.moveTo(300, 50);
    pincel.lineTo(50, 200);
    pincel.lineTo(550, 200);
    pincel.fill();

    pincel.beginPath();
    pincel.moveTo(50, 200);
    pincel.lineTo(300, 350);
    pincel.lineTo(550, 200);
    pincel.fill();

    pincel.fillStyle="darkblue";
    pincel.beginPath();

    pincel.arc(300, 200, 100, 0, 2* 3.14);
    pincel.fill();
}


function desenhaBandeiraAlemanha() {
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle = 'black';
    pincel.fillRect(0, 0, 600, 133);

    pincel.fillStyle = 'red';
    pincel.fillRect(0, 133, 600, 133);

    pincel.fillStyle = 'yellow';
    pincel.fillRect(0, 266, 600, 133);
}

var bandeiraBrasil = true;
var timerB = 0;
var timerA = 0;

function trocaBandeira(){

    if(bandeiraBrasil == true && timerB < 1){

        desenhaBandeiraBrasil();
        timerB++;
    }else{

        bandeiraBrasil = false;
        timerB = 0;
    }

    if(bandeiraBrasil == false && timerA < 1){

        desenhaBandeiraAlemanha();
        timerA++;
    }else{

        bandeiraBrasil = true;
        timerA = 0;
    }
}


setInterval(trocaBandeira,3000);
</script>
2 respostas
solução!

Olá Lucas,

Resumindo pelo que entendi, do jeito que foi feito acaba tendo que passar pelos testes 1 vez pra desenhar a bandeira da Alemanha e duas vezes pra desenhar a do Brasil.

Tentando explicar:

Nesse caso, na primeira vez que passa pela função "trocaBandeira" é feito o teste do primeiro if, que passa no teste desenhando a bandeira do Brasil e acrescentando 1 no timerB, ele já passa logo em seguida no segundo if testando, mas não muda nada, pois as variáveis do else estão com o mesmo valor.

Quando ele passa novamente, pra testar, estando timerA 0, timerB 1, bandeiraBrasil = true, ele vai para o primeiro else, alterando bandeiraBrasil para false e setando o timerB para 0. Continuando ele vai para o segundo if, nesse caso ele passa no if e desenha a bandeira da Alemanha e seta o timerA para 1.

Quando vai testar novamente da outra vez ele entrar na função, ele ainda vai estar com timerA 1, timerB 0, bandeiraBrasil false então ele não passa no primeiro if nesse caso não conseguindo desenhar a bandeira do Brasil dessa vez, o else acaba não mudando nada, ai quando vai pro segundo if, ele não passa pelo if e vai pro else, onde muda bandeiraBrasil para true e timerA para 0.

Quando vai passar novamente ai sim que ele consegue passar no primeiro if e desenha a bandeira do brasil, depois voltando desde o começo.

Ahh sim, agora eu consegui compreender. Era esse tipo de leitura que eu não estava conseguindo fazer pq eu estava lendo os if's e else's individualmente mas não estava jogando o resultado pra segunda volta em diante. Acompanhando a sua leitura eu consegui entender.

Muito obrigado pela ajuda!!