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

A bandeira do Brasil fica atrás da Alemanha, como resolver?

Consegui fazer funcionar assim:

//(...)
var troca = 1;

function trocaBandeira() {

    if (troca == 1) {
        desenhaBandeiraBrasil();
        troca = troca + 1;
        } else {

            desenhaBandeiraAlemanha();
            troca = troca - 1;
        } 
    } 
    //(...)

Mas, se repararmos bem, a bandeira do Brasil continua aparecendo atrás da bandeira da Alemanha (linha fina verde na porção inferior). Tentei usar a função limpaTela() para apagar a do Brasil antes de mostrar a da Alemanha, mas não funcionou... Alguém sabe como fazer?

4 respostas

Suspeitei de início de uma hierarquia na chama das funções, mas é o simplesmente fato das bandeiras criarem diversas camadas.

function Alemanha() {


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

function mostra(bandeira,tempo)
{
    var bra = setInterval(bandeira,tempo)
}

mostra(Alemanha,3000)
mostra(Brasil,6000)

</script>

mesmo ordem acontece a sobreposição, então

mostra(Brasil,3000)
mostra(Alemanha,6000)

precisaríamos apagar a bandeira em espera, contudo também tentei utilizar o clearRect e falhei. Todavia existe uma medida paliativa que é aumentar a faixa amarela da bandeira da Alemanha. :)


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

<script>

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

function Brasil() {


    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 Alemanha() {


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

function mostra(bandeira,tempo)
{
    var bra = setInterval(bandeira,tempo)
}

mostra(Brasil,3000)
mostra(Alemanha,6000)

</script>

Seria ótimo ver a versão com clearRect , mas infelizmente não possuo o conhecimento necessário no momento. Bons estudos!

A troca foi bem inteligente, sendo a lógica exatamente a mesma do booleano (true = 1 | false = 0) no seu caso o uso do 2.

Olá, Vitor, agradeço muito suas sugestões, certamente contribuíram muito.

Mas a minha preocupação em não aparecerem as duas bandeiras ao mesmo tempo é para o caso de trabalharmos com duas imagens assimétricas.

Nesse caso, uma não encobriria totalmente a outra, por isso eu gostaria de saber como fazer para uma desaparecer efetivamente do canvas quando a outra fosse exibida.

Acredito que ainda vamos encontrar uma solução ao longo dos cursos.

Muito grata, bons estudos!

solução!

Depois de quebrar muito a cabeça e quase desistir (na verdade, eu já tinha desistido...), encontrei uma maneira de limpar a tela antes de mostrar a bandeira da Alemanha.

Fiz estes ajustes no código:

Criei a função limpaTela( );:

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

Onde 0,0 é a coordenada de início e 600,400 a de fim, delimitando a área a ser limpa (=canvas).

Também passei as variáveis tela e pincel para fora das funções, tornando-as acessíveis de qualquer lugar do código.

Incluí a função "limpaTela" na função "trocaBandeira":

function trocaBandeira() {

    if (troca == 1) {
        desenhaBandeiraBrasil();

        troca = troca + 1;

        } else {

        limpaTela();

        desenhaBandeiraAlemanha();
            troca = troca - 1;
        } 
    } 

Segue o código completo:

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

<script>

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


function desenhaBandeiraBrasil() {

    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 limpaTela(){
    pincel.clearRect(0, 0, 600, 400)
}


function desenhaBandeiraAlemanha() {

    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 troca = 1;

function trocaBandeira() {

    if (troca == 1) {
        desenhaBandeiraBrasil();

        troca = troca + 1;

        } else {

        limpaTela();

        desenhaBandeiraAlemanha();
            troca = troca - 1;
        } 
    } 

    setInterval(trocaBandeira, 3000);


</script>

É isso :)

Bons estudos, pessoal!