Olá, pessoal acabei comprando um livro da Casa do Código “Crie um jogo do zero utilizando classes nativas”. Cheguei em um ponto onde está acontecendo um erro.
java.lang.NullPointerException: Attempt to invoke virtual method ‘int com.sshtecnologia.jumper.engine.Tela.getAltura()’ on a null object reference
Acredito que este erro diz respeito apenas a instanciação de classes, mas não sei onde devo fazer isso
Tenho 3 classes, que envolvem esse problema. Game, Tela,Cano.
O erro acontece justamente nesse ponto
this.cano = new Cano(this.tela, 200);------------------------
Se alguém puder me dar alguma ajuda.
package com.sshtecnologia.jumper.engine;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import com.sshtecnologia.jumper.Elementos.Passaro;
import com.sshtecnologia.jumper.R;
public class Game extends SurfaceView implements Runnable, View.OnTouchListener {
private final SurfaceHolder holder = getHolder();
private boolean estaRodando = true;
private Passaro passaro;
private Cano cano;
private Bitmap background;
private Tela tela;
public Game(Context context) {
super(context);
inicializaElementos();
setOnTouchListener(this);
tela = new Tela(context);
}
private void inicializaElementos() {
Bitmap back = BitmapFactory.decodeResource(getResources(), R.drawable.background);
this.background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
// this.background = Bitmap.createScaledBitmap(back, back.getWidth(), this.tela.getAltura(), false);
this.passaro = new Passaro();
this.cano = new Cano(this.tela, 200);------------------------
}
@Override
public void run() {
while (this.estaRodando) {
if (!this.holder.getSurface().isValid()) continue;
Canvas canvas = this.holder.lockCanvas();
canvas.drawBitmap(this.background, 0, 0, null);
this.passaro.desenhaNo(canvas);
// this.cano.desenhaNo(canvas);
this.passaro.cai();
// this.cano.move();
this.holder.unlockCanvasAndPost(canvas);
}
}
public void cancela() {
this.estaRodando = false;
}
public void inicia() {
this.estaRodando = true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
this.passaro.pula();
return false;
}
}
Cano
package com.sshtecnologia.jumper.engine;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.sshtecnologia.jumper.engine.Cores;
import com.sshtecnologia.jumper.engine.Tela;
public class Cano {
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 alturaDoCanoInferior;
private Tela tela;
private int posicao;
public Cano(Tela tela, int posicao) {
this.posicao = posicao;
this.alturaDoCanoInferior = tela.getAltura() - TAMANHO_DO_CANO;
}
public void desenhaNo(Canvas canvas) {
desenhaCanoInferiorNo(canvas);
}
private void desenhaCanoInferiorNo(Canvas canvas) {
canvas.drawRect(this.posicao,
this.alturaDoCanoInferior,
this.posicao + LARGURA_DO_CANO,
this.tela.getAltura(), VERDE);
}
public void move() {
this.posicao -= 5;
}
}
Tela
package com.sshtecnologia.jumper.engine;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
public class Tela {
private DisplayMetrics metrics;
public Tela(Context context) {
WindowManager wm = (WindowManager)
context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
this.metrics = new DisplayMetrics();
display.getMetrics(this.metrics);
}
public int getAltura() {
return this.metrics.heightPixels;
}
}