Você tem que aprender a interpretar o que os códigos fazem.
Nesse fonte que você postou agora você manipula dois objetos Graphics diferentes:
- Um
Graphics da imagem que você está montando em memória
- Outro
Graphics do buffer de renderização da sua janela
Veja os comentários que coloquei no fonte que você postou:
public void render() {
BufferStrategy bs = this.getBufferStrategy(); // aqui você pega o BufferStrategy da sua janela, é aqui que você vai apresentar a imagem criada em memória
if (bs == null) {
this.createBufferStrategy(3);
return;
}
// aqui você está pegando o Graphics da imagem que criou em memória
Graphics g = image.getGraphics();
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);
world.render(g); // aqui está mandando o objeto world se pintar no Graphics da imagem em memória
for (int i = 0; i < entities.size(); i++) {
Entity e = entities.get(i);
e.render(g); // aqui está mandando cada objeto do tipo Entity se pintar no Graphics da imagem em memória
}
for (int i = 0; i < tiros.size(); i++) {
tiros.get(i).render(g); // aqui está mandando cada objeto tiro se pintar no Graphics da imagem em memória
}
ui.render(g); // aqui está mandando o objeto ui se pintar no Graphics da imagem em memória
g.dispose();
g = bs.getDrawGraphics(); // aqui você está sobrescrevendo sua variável g com Graphics do BufferStrategy, que é onde você vai apresentar a imagem que está em memória
// daqui pra frente o g não é mais o Graphics da imagem que está em memória
// agora o g corresponde à superficie onde você vai apresentar a imagem
g.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null); // aqui você apresenta a imagem
g.setFont(new Font("arial", Font.BOLD,20));
g.setColor(Color.white);
g.drawString("Munição: "+player.muniçao, 15, 60);
g.setFont(new Font("Arial", Font.BOLD, 20));
g.setColor(Color.BLACK);
g.drawString("FPS: " + fps, (WIDTH * SCALE) - 100, (HEIGHT * SCALE) - 50);
bs.show(); // aqui você manda o BufferStrategy apresentar o conteúdo do Graphics
}
Se eu fosse você, tentaria utilizar nomes de variáveis mais sugestivos para você entender o que está fazendo.
Exemplo:
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics graphicsDaImagem = image.getGraphics();
graphicsDaImagem.setColor(new Color(0, 0, 0));
graphicsDaImagem.fillRect(0, 0, WIDTH, HEIGHT);
world.render(graphicsDaImagem);
for (int i = 0; i < entities.size(); i++) {
Entity e = entities.get(i);
e.render(graphicsDaImagem);
}
for (int i = 0; i < tiros.size(); i++) {
tiros.get(i).render(graphicsDaImagem);
}
ui.render(graphicsDaImagem);
graphicsDaImagem.dispose();
Graphics graphicsDaTela = bs.getDrawGraphics();
graphicsDaTela.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
graphicsDaTela.setFont(new Font("arial", Font.BOLD,20));
graphicsDaTela.setColor(Color.white);
graphicsDaTela.drawString("Munição: "+player.muniçao, 15, 60);
graphicsDaTela.setFont(new Font("Arial", Font.BOLD, 20));
graphicsDaTela.setColor(Color.BLACK);
graphicsDaTela.drawString("FPS: " + fps, (WIDTH * SCALE) - 100, (HEIGHT * SCALE) - 50);
bs.show();
}