Fiz a comparação e parece esta tudo igual.
Já olhei com muita calma e não consigo achar o porque desse "NullPointerException".
Classe Cano
public class Cano {
private int alturaDoCanoSuperior;
private int alturaDoCanoInferior;
private int posicao;
private static final int TAMANHO_DO_CANO = 250;
private static final int LARGURA_DO_CANO = 100;
private final Paint verde = Cores.getCorDoCano();
private Tela tela;
public Cano(Tela tela, int posicao) {
this.tela = tela;
this.posicao = posicao;
this.alturaDoCanoSuperior = 0 + TAMANHO_DO_CANO + valorAleatorio();
this.alturaDoCanoInferior = tela.getAltura() - TAMANHO_DO_CANO - valorAleatorio();
}
public void desenhaNo(Canvas canvas){
desenhaCanoSuperiorNo(canvas);
desenhaCanoInferiorNo(canvas);
}
private void desenhaCanoSuperiorNo(Canvas canvas) {
canvas.drawRect(posicao, 0, posicao + LARGURA_DO_CANO, alturaDoCanoSuperior, verde);
}
private void desenhaCanoInferiorNo(Canvas canvas) {
canvas.drawRect(posicao, alturaDoCanoInferior, posicao + LARGURA_DO_CANO, tela.getAltura(), verde);
}
public void move() {
posicao -= 5;
}
private int valorAleatorio() {
return (int) (Math.random() * 150);
}
public int getPosicao() {
return posicao;
}
public boolean saiuDaTela() {
return posicao + LARGURA_DO_CANO < 0;
}
}
Classe Canos
public class Canos {
private static final int QUANTIDADE_DE_CANOS = 5;
private static final int DISTANCIA_ENTRE_CANOS = 250;
private List<Cano> canos = new ArrayList<Cano>();
private Tela tela;
private Pontuacao pontuacao;
public Canos(Tela tela, Pontuacao pontuacao) {
int posicaoInicial = 200;
for(int i=0; i < QUANTIDADE_DE_CANOS; i++) {
posicaoInicial += DISTANCIA_ENTRE_CANOS;
canos.add(new Cano(tela, posicaoInicial));
}
}
public void desenhaNo(Canvas canvas) {
for(Cano cano : canos)
cano.desenhaNo(canvas);
}
public void move() {
ListIterator<Cano> iterator = canos.listIterator();
while(iterator.hasNext()) {
Cano cano = (Cano) iterator.next();
cano.move();
if(cano.saiuDaTela()) {
pontuacao.aumenta();
iterator.remove();
Cano outroCano = new Cano(tela, getMaximo() + DISTANCIA_ENTRE_CANOS);
iterator.add(outroCano);
}
}
}
private int getMaximo() {
int maximo = 0;
for(Cano cano : canos) {
maximo = Math.max(cano.getPosicao(), maximo);
}
return maximo;
}
}
Classe Pontuacao
public class Pontuacao {
private static final Paint BRANCO = Cores.getCorDaPontuacao();
private int pontos = 0;
public void aumenta() {
pontos++;
}
public void desenhaNo(Canvas canvas) {
canvas.drawText(String.valueOf(pontos), 100, 100, BRANCO);
}
}
Classe Tela
public class Tela {
private DisplayMetrics metrics;
public Tela(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
metrics = new DisplayMetrics();
display.getMetrics(metrics);
}
public int getAltura() {
return metrics.heightPixels;
}
}
Classe Game
public class Game extends SurfaceView implements Runnable, View.OnTouchListener {
private boolean isRunning = true;
private final SurfaceHolder holder = getHolder();
private Passaro passaro;
private Bitmap background;
private Tela tela;
private Cano cano;
private Canos canos;
private Pontuacao pontuacao;
public Game(Context context) {
super(context);
tela = new Tela(context);
inicializaElementos();
setOnTouchListener(this);
}
private void inicializaElementos() {
this.passaro = new Passaro(tela);
this.canos = new Canos(tela, pontuacao);
this.pontuacao = new Pontuacao();
Bitmap back = BitmapFactory.decodeResource(getResources(), R.drawable.background);
this.background = Bitmap.createScaledBitmap(back, back.getWidth(), tela.getAltura(), false);
}
public void inicia() {
this.isRunning = true;
}
@Override
public void run() {
while(isRunning) {
if(!holder.getSurface().isValid()) continue;
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(background, 0, 0, null);
passaro.desenhaNo(canvas);
passaro.cai();
canos.desenhaNo(canvas);
canos.move();
pontuacao.desenhaNo(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
public void cancela() {
this.isRunning = false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
passaro.pula();
return false;
}
}