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

Como criar a impressão de animação no pássaro?

Como tema da aula quero saber como posso implementar 2 bitmaps que se alternam na mesma posição. Como um primeiro bitmap de um pássaro com a asa abaixada e um segundo com a asa levantada, criando a impressão de animação. Pensei em algo do tipo criando no desenhaNo da classe pássaro, duas imagens, mas uma fica sobre a outra de maneira fixa, tampando a primeira. Do mesmo jeito que a cada novo frame a nova posição do pássaro "apaga" a anterior será que tem como fazer um loop de exibição de 2 imagens se sobrepondo?

5 respostas

Olá Christoferson,

Você consegue fazer isso sim seguindo mais ou menos essa ideia que você propôs. Para isso você vai precisar criar um outro Bitmap para a segunda imagem do pássaro e no método desenhaNo você tem que conseguir alternar entre as duas imagens de alguma forma. Ou você vai desenhar a primeira imagem ou a segunda imagem, só precisamos decidir qual vai ser a condição que vai dizer qual imagem usar em cada quadro.

Para controlar isso, você pode criar um atributo contador na classe Passaro. Como a gente chama o método cai() a todo quadro do jogo, vamos aproveitar para incrementar o contador também logo no início desse método.

Agora, com o contador atualizado, você pode fazer uma verificação no método desenhaNo() e desenhar a primeira imagem se o contador for par ou desenha a segunda imagem se o contador for ímpar. Esse código ficaria mais ou menos assim:

    public void desenhaNo(Canvas canvas) {
        if (contador % 2 == 0) {
            canvas.drawBitmap(passaro, X - RAIO, altura - RAIO, null);
        } else {
            canvas.drawBitmap(passaro2, X - RAIO, altura - RAIO, null);
        }
    }

Provavelmente a animação vai ficar bem rápida se fizermos dessa forma então com desafio você pode alterar essa verificação para realizar a troca das imagens somente a cada 4 quadros, por exemplo.

Tentei e tentei bastante pensando em como fazer isso e só o consegui foi algo assim:

public void desenhaNo(Canvas canvas) {
    canvas.drawBitmap(passaro1, X - RAIO, altura - RAIO, null);
        if (contador % 4 == 0) {
            if ( verificação se "passaro1" está sendo exibido no momento) {
                canvas.drawBitmap(passaro2, X - RAIO, altura - RAIO, null);
            } else {
                canvas.drawBitmap(passaro1, X - RAIO, altura - RAIO, null);
            }

Não sei se essa forma de pensar pode estar correta, mas travei nisso, socorro! kkkk

Desculpe por tantas perguntas, mas sou novo em programação e ainda tenho muitas dúvidas. As vezes o que é relativamente simples ainda soa como um desafio pra mim. Mas obrigado pela paciência em ensinar!

solução!

Opa Christoferson, sem problemas!

Vamos primeiro entender o que o seu código está fazendo. Na primeira linha do desenhaNo(), estamos desenhando o pássaro 1. Nesse caso, ela linha não seria necessária pois precisamos primeiro verificar o contador antes de decidir qual pássaro desenhar.

A verificação contador % 4 == 0 está verificando se o resto da divisão do contador por 4 é 0. Então a gente só vai desenhar o pássaro 2 se o contador for múltiplo de 4! Isso significa que vamos mostrar o pássaro 1 quando o contador for 1, 2 e 3 e o pássaro 2 quando o contador for 4, 8, 12, etc.

O ideal seria que a gente mostrasse cada um dos pássaros numa quantidade igual de quadros do jogo. Para fazer isso, vamos modificar a verificação para a seguinte:

if (contador >= 4) {
    canvas.drawBitmap(passaro2, X - RAIO, altura - RAIO, null);
} else {
    canvas.drawBitmap(passaro1, X - RAIO, altura - RAIO, null);
}

Desse modo, quando contador for 0,1,2,3 desenhamos o pássaro 1. Caso contrário, no 4, 5, 6, 7 desenhamos o pássaro 2. Mas agora precisamos tomar cuidado para que o contador não passe de 7. Para isso vamos modificar o código do método cai() pra ficar assim:

public void cai() {
    contador++;
    if (contador > 7) {
        contador=0;
    }

    // resto do código
}

Agora sim! Toda vez que o pássaro cai um pouquinho estamos aumentando o contador. Enquanto ele for menor que 4 mostramos o pássaro 1. Quando ele for maior ou igual a 4 passamos a mostrar o pássaro 2. E finalmente quando o contador passar de 7, resetamos o contador para 0 e então passamos a exibir novamente o pássaro 1. Com isso você deve conseguir fazer a animação do pássaro!

Muito obrigado Jeferson! Explicação muito clara. Funcionou perfeitamente, valeu!