Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Aula 4: Erro Tela.getAltura()

Apresentou dois problemas.

O primeiro problema é o cano não inicializar no centro da tela conforme o exemplo do vídeo, mas inicializa no canto esquerda da tela.

Outro problema foi na criação da variável "chegouNoChao" (public void cai()) que utiliza a tela.getAltura(), causando esse erro:

11112-11163/jumper.fellipe.com.br.jumper E/AndroidRuntime: FATAL EXCEPTION: Thread-160
                                                                              Process: jumper.fellipe.com.br.jumper, PID: 11112
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'int jumper.fellipe.com.br.jumper.graphic.Tela.getAltura()' on a null object reference
                                                                                  at jumper.fellipe.com.br.jumper.elements.Passaro.cai(Passaro.java:35)
                                                                                  at jumper.fellipe.com.br.jumper.engine.Game.run(Game.java:57)
                                                                                  at java.lang.Thread.run(Thread.java:818)

Ao substituir o tela.getAltura() por algum algum número o erro não ocorre e consigo inicializar o jogo.

Depurei esse trecho e aparentemente os valores estão corretos: http://i.imgur.com/9dtcnFy.png

Segue o código:

public class Passaro {

    private static final float X = 100;
    private static final float RAIO = 50;
    private static final Paint VERMELHO = Cores.getCordoPassaro();
    private float altura;
    private Tela tela;


    public Passaro(Tela tela){
        this.altura = 100;

    }


    public void desenhaNo(Canvas canvas){
        canvas.drawCircle(X, altura, RAIO, VERMELHO);

    }


    public void cai() {
        boolean chegouNoChao = altura + RAIO > tela.getAltura(); //-->Se colocar o valor de 1270 ao invés do tela.getAltura(), não ocorre o erro e o comportamento do desenho na tela fica conforme esperado
        if(!chegouNoChao) {
            this.altura += 5;
        }
    }

    public void pula() {
        if(altura - RAIO > 0) {
            this.altura -= 150;
        }
    }
}
 private int alturaDoCanoInferior;
    private Tela tela;
    private static final int TAMANHO_DO_CANO = 250;
    private static final int LARGURA_DO_CANO = 100;
    private static final Paint VERDE = Cores.getCorDoCano();
    private int posicao; //--> Se declaro um valor como posição 600, o cano inicializa mais centralizado, o problema que só está aparecendo um cano

    public Cano(Tela tela, int posicao){
        this.tela = tela;
        alturaDoCanoInferior = tela.getAltura() - TAMANHO_DO_CANO;


    }

    public void desenhaNo(Canvas canvas) {
        desenhaCanoInferior(canvas);

    }

    private void desenhaCanoInferior(Canvas canvas) {
        canvas.drawRect(posicao, alturaDoCanoInferior, posicao + LARGURA_DO_CANO, tela.getAltura(), VERDE);
    }


    public void move() {
        this.posicao -= 5;
    }
}
public class MainActivity extends Activity {


    private Game game;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FrameLayout container = (FrameLayout) findViewById(R.id.container);

        game = new Game(this);
        container.addView(game); //--> ao depurar o código, o programa para nesse ponto
    }

    @Override
    protected void onResume() {
        super.onResume();
        game.inicia();
        new Thread(game).start();
    }

    @Override
    protected void onPause() {
        super.onPause();
        game.pausa();
    }
}
1 resposta
solução!

Consegui corrigir. O problema que faltou o this em dois pontos do código:

 public Passaro(Tela tela){
        this.tela = tela; //-->Faltou esse
        this.altura = 100;

    }
public Cano(Tela tela, int posicao){
        this.tela = tela;
        this.posicao = posicao; //-->Faltou esse
        alturaDoCanoInferior = tela.getAltura() - TAMANHO_DO_CANO;
    }