Draw do java não desenha

Eu estava fazendo um simples projeto repetindo os passos de um video gringo que encontrei de um projeto do jogo da cobrinha, fui seguindo passo a passo e simplesmente o que eu codei não desenha nada do jogo, mesmo estando idêntico ao código do gringo. O que pode estar ocorrendo ? fiz um segundo projeto com o código do gringo e rodou, contudo o meu fica apenas nessa tela preta:

Segue o código:
public class JogoDaCobrinha {

public static void main(String[] args) {

	new GameFrame();
	
}

}

public class GameFrame extends JFrame {

GameFrame() {
	this.add(new GamePanel());
	this.setTitle("Jogo da Cobrinha");
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setResizable(false);
	this.pack();
	this.setVisible(true);
	this.setLocationRelativeTo(null);
}

}

public class GamePanel extends JPanel implements ActionListener {

static final int LARGURA_TELA = 800;
static final int ALTURA_TELA = 800;
static final int TAMANHO_UNIDADE = 30;
static final int UNIDADES_JOGO = (LARGURA_TELA * ALTURA_TELA) / TAMANHO_UNIDADE;
static final int DELAY = 85;
final int x[] = new int[UNIDADES_JOGO];
final int y[] = new int[UNIDADES_JOGO];
int partesDoCorpo = 6;
int macasComidas;
int macaX;
int macaY;
char direcao = 'R';
boolean rodando = false;
Timer timer;
Random random;

GamePanel() {
	random = new Random();
	this.setPreferredSize(new Dimension(LARGURA_TELA, ALTURA_TELA));
	this.setBackground(Color.black);
	this.setFocusable(true);
	this.addKeyListener(new AdaptadorDeTecla());
	comecaJogo();
}

public void comecaJogo() {
	novaMaca();
	rodando = true;
	timer = new Timer(DELAY, this);
	timer.start();

}

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

public void desenhar(Graphics g) {

	if (rodando) {
		g.setColor(Color.red);
		g.fillOval(macaX, macaY, TAMANHO_UNIDADE, TAMANHO_UNIDADE);

		for (int i = 0; i < partesDoCorpo; i++) {
			if (i == 0) {
				g.setColor(Color.green);
				g.fillRect(x[i], y[i], TAMANHO_UNIDADE, TAMANHO_UNIDADE);
			} else {
				g.setColor(new Color(45, 180, 0));
				g.fillRect(x[i], y[i], TAMANHO_UNIDADE, TAMANHO_UNIDADE);
			}
		}
		g.setColor(Color.red);
		g.setFont(new Font("Ink Free", Font.BOLD, 40));
		FontMetrics metrics = getFontMetrics(g.getFont());
		g.drawString("PLACAR: " + macasComidas, (LARGURA_TELA - metrics.stringWidth("PLACAR: " + macasComidas))/2, g.getFont().getSize());
	}
	else {
		gameOver(g);
	}
}

public void novaMaca() {
	macaX = random.nextInt((int) (LARGURA_TELA / TAMANHO_UNIDADE)) * TAMANHO_UNIDADE;
	macaY = random.nextInt((int) (ALTURA_TELA / TAMANHO_UNIDADE)) * TAMANHO_UNIDADE;

}

public void mover() {
	for (int i = partesDoCorpo; i > 0; i--) {
		x[i] = x[i - 1];
		y[i] = y[i - 1];
	}

	switch (direcao) {
	case 'C':
		y[0] = y[0] - TAMANHO_UNIDADE;
		break;
	case 'B':
		y[0] = y[0] + TAMANHO_UNIDADE;
		break;
	case 'E':
		x[0] = x[0] - TAMANHO_UNIDADE;
		break;
	case 'D':
		x[0] = x[0] + TAMANHO_UNIDADE;
		break;

	}

}

public void checarMaca() {
	if ((x[0] == macaX) && (y[0] == macaY)) {
		partesDoCorpo++;
		macasComidas++;
		novaMaca();
	}
}

public void checarColisao() {
	// Checar se colide com a cabeçaS
	for (int i = partesDoCorpo; i > 0; i--) {
		if ((x[0] == x[i]) && (y[0] == y[i])) {
			rodando = false;
		}
	}
	// Checar se a cabeça colide com a borda da esquerda
	if (x[0] < 0) {
		rodando = false;
	}
	// Checar se a cabeça colide com a borda da direita
	if (x[0] < LARGURA_TELA) {
		rodando = false;
	}
	// Checar se a cabeça colide com a borda do topo
	if (y[0] < 0) {
		rodando = false;
	}
	// Checar se a cabeça colide com a borda da esquerda
	if (x[0] < 0) {
		rodando = false;
	}
	// Chegar se a cabeça colide com a borda de baixo
	if (y[0] < ALTURA_TELA) {
		rodando = false;
	}

	if (!rodando) {
		timer.stop();
	}

}

public void gameOver(Graphics g) {
	//Texto de GameOver
	g.setColor(Color.red);
	g.setFont(new Font("Ink Free", Font.BOLD, 75));
	FontMetrics metrics1 = getFontMetrics(g.getFont());
	g.drawString("VOCÊ PERDEU", (LARGURA_TELA - metrics1.stringWidth("VOCÊ PERDEU"))/2, ALTURA_TELA/2);
	
	//Placar GameOver
	g.setColor(Color.red);
	g.setFont(new Font("Ink Free", Font.BOLD, 40));
	FontMetrics metrics2 = getFontMetrics(g.getFont());
	g.drawString("PLACAR: " + macasComidas, (LARGURA_TELA - metrics2.stringWidth("PLACAR: " + macasComidas))/2, g.getFont().getSize());
}

@Override
public void actionPerformed(ActionEvent arg0) {

	if (rodando) {
		mover();
		checarMaca();
		checarColisao();
	}
	repaint();

}

public class AdaptadorDeTecla extends KeyAdapter {
	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) {
		case KeyEvent.VK_LEFT:
			if (direcao != 'D') {
				direcao = 'E';
			}
			break;
		case KeyEvent.VK_RIGHT:
			if (direcao != 'E') {
				direcao = 'R';
			}
			break;
		case KeyEvent.VK_UP:
			if (direcao != 'B') {
				direcao = 'C';
			}
			break;
		case KeyEvent.VK_DOWN:
			if (direcao != 'C') {
				direcao = 'B';
			}
			break;
		}

	}
}

}

Você inventou de traduzir para o português, o nome de um método que deveria ser sobrescrito.

Nomes de métodos costumam ser verbos, então “paint component” significa “pintar o componente”, este método é chamado pela classe pai para o componente se pintar no Graphics passado por parâmetro.

Por isso você não pode dar um outro nome para ele, ao sobrescrever, ele precisa ter o mesmo nome e parâmetros do método da classe pai.

No seu caso, o método sobrescrito tem que se chamar paintComponent, dessa forma:

@Override
protected void paintComponent(Graphics g) {
	super.paintComponent(g);
	desenhar(g);
}
3 curtidas

Fui reparar isso só aqui na escola, muito obg, agr meu desafio esta sendo de fazer um botão ou Tecla que quando acionado zere tudo e recomece o jogo.