Tela.getAltura() on a null object reference

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

}