Projeto mini game, problema com listener?

Galera seria redundante ficar cortando pedaço de codigo pra perguntar algo que engloba todo o escopo desse mini programa. Trata-se de um simples painel com um fundo, um vetor com pontos para posicionar uma certa imagem e uma imagem que, ao “clicar num ponto desse vetor” na tela, posiciona-se nela. Seriam elas fundo, pontos e corpo, sendo que pontos sao as coordenadas para impressao de certa imagem (sapos).

Agora o problema aqui eu ainda nao entendi pois compilou normal embora o output do meu compilador esteja dando alguns erros NullPointer em desenha().

Outra coisa se relaciona a interfaces e adaptadoras de interface. Me pergunto a utilidade de uma adaptadora de interface se vc nao pode simplesmente “implements MouseAdapter” :roll: Tive que implementar dentro do argumento de addMouseListener como poderao ver abaixo.

Vou colar o codigo pois o programa todo que fiz eh pequeno e simples de entender e obviamente necessario para alguem da comunidade que queira ajudar e entender o problema.

ansioso pela resposta,

rasta jones

---------------------------- Game.java ----------------------------

import java.awt.;
import java.awt.event.
;
import javax.swing.*;

// ----- PAINEL ----- //
class GamePainel extends JPanel {

private static final int MAXPONTOS = 400;
private static final int TAMPONTOS = 20;
private Point[] pontos = new Point[MAXPONTOS];
private Point corpoPosicao = new Point(60,0);
private int atual = -1;

public GamePainel() {
    addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
            int x = evt.getX();
            int y = evt.getY();
            atual = procura(x,y);
            corpoPosicao.x=x; corpoPosicao.y=y;
            if(atual>=0) remove(atual);
            }
        });
    }



public int procura(int x, int y) {
    for(int i=0; i < pontos.length; i++) {
        if((pontos[i].x - TAMPONTOS / 2 <= x) && (x <= pontos[i].x + TAMPONTOS / 2) &&
            (pontos[i].y - TAMPONTOS / 2 <= y) && (y <= pontos[i].y + TAMPONTOS / 2)) {
            return i;
            }
        }
    return -1;
    }

public void remove(int i) {
    pontos[i] = pontos[pontos.length-1];
    atual = -1;
    repaint();
    }

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    desenha(g);
    }

public void desenha(Graphics g) {
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image fundo = tk.getImage("fundo.gif");
    Image corpo = tk.getImage("corpo.gif");
    Image sapos = tk.getImage("sapo.gif");
    g.drawImage(fundo,0,0,this);
    g.drawImage(corpo,corpoPosicao.x,corpoPosicao.y,this);
    for(int i=0; i < pontos.length; i++)
        g.drawImage(sapos,pontos[i].x,pontos[i].y,this);
    }
}

// ----- FRAME ----- //
class GameFrame extends JFrame{
public GameFrame() {
setTitle(“GAME”);
setSize(400,400);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
Container painel = getContentPane();
painel.add(new GamePainel());
}
}

// ----- MAIN ----- //
public class Game {
public static void main(String[] args) {
JFrame frame = new GameFrame();
frame.show();
}
}