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

Usar o próprio tempo real como fator de comparação

No exercício da bandeira, entendi perfeitamente a solução apresentada. Eu havia pensado em a cada milisegundo (a cada UM milisegundo), incrementar o tempo em 1 milisegundo, o que parece lógico, mas o meu programa roda muito devagar e demora bastante tempo para trocar as bandeiras.

criei uma variável incremento (que vai de um em um, mas fui testando outros valores..)

ACHO que a resposta do porque não dá certo se deve ao fato de o tempo (real) para processar uma instrução não seja irrelevante perto de 1 milisegundo..é isso? Ou algum conceito meu está errado.

(obs, quando eu coloquei o incremento de 100, bem como no tempo em setInterval, foi quando chegou mais perto de 3 segundos).

Algum oráculo, por gentileza.. Obrigado, abraços.

Segue o código:

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

<script>

/*Você deve mostrar a bandeira do Brasil por 3 segundos e depois da Alemanha,
sempre intercalando! Para tal, tente escrever uma função trocaBandeira e use
a função setInterval para chamá-la a cada 3 segundos.*/

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);
}


//só daqui para baixo é diferente, mas copiei o código todo de qualquer forma

function trocaBandeira() {

    if (tempo <= 3000) {
        desenhaBandeiraBrasil();
        tempo = tempo + incremento;
    } else if (tempo > 3000 && tempo <= 6000) {
        desenhaBandeiraAlemanha();
        tempo = tempo + incremento;
    } else if (tempo > 6000) {
        tempo = 0;
    }

}

    var tempo = 0;
    var incremento = 1;

    setInterval(trocaBandeira, 1);

</script>
2 respostas
solução!

Bom dia! Seu raciocínio é por ai mesmo. Vou um pouco mais além na minha resposta sem entrar em aspectos técnicos, até porque este é um curso de lógica e aprendemos o mínimo de JavaScript para que você, meu aluno, possa afiar suas habilidades.

Você não tem como garantir que 3 segundos será 3 segundos por mais estranho que isso possa parecer. Quando avançar na linguagem JavaScript verá que há um tal de event loop e que callbacks (por exemplo, a função que você executa no setInterval) são executados em paralelo e depois voltam para a pilha de execução. Entre a sua execução e seu retorno pode haver um hiato.

Deixando aspectos extremamente técnicos de lados, só o fato de você ter se aproximado já dá para você um grande mérito e um aplauso desse seu instrutor aqui.

Entendi! Obrigado!!