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