Imagem

por que a imagem não aparece???

public class Principal {

	public JFrame frame;
	public String imagemPeth =("/peixe.png");
	public Image image;
	public BufferedImage bufferedIm;
	public Graphics grafico;
	
	public void janela() {
		frame = new JFrame("okkk");
		frame.setPreferredSize(new Dimension(500,500));
		frame.setSize(500, 500);
		frame.setLocationRelativeTo(null);
		
		imagem();
		frame.setVisible(true);

	}
	
	public void imagem(){
		
		try {
			bufferedIm = ImageIO.read(getClass().getResource(imagemPeth));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		Graphics g = bufferedIm.getGraphics();
		render(g);
		
	}

	public static void main(String[] args) {
		Principal p = new Principal();
		p.janela();
		
	}
	
	public void render(Graphics g){
		
		g.drawImage(bufferedIm, 0, 0,100,100, null);
	}

}

Por que você está desenhando a imagem nela mesma e não na janela, veja:

Graphics g = bufferedIm.getGraphics(); // o graphics da própria imagem
render(g); // agora está chamando o render passando esse graphics

O que o render faz?

g.drawImage(bufferedIm, 0, 0,100,100, null); // está desenhando a própria imagem em si mesmo

Se você quer desenhar imagens no fundo de um componente, precisa sobrescrever o método paintComponent daquele componente.

Meses atrás você já postou uma dúvida parecida.

foi achei q a primeira não tinha ido por q caiu a net queria fazer sem usar o método print

queria sem usar paintComponent, não sei expressar bem digitando minha duvida, vou fazer outros testes aqui para ver.

Então, o JFrame e JPanel não possuem métodos prontos para você desenhar uma imagem de fundo neles então você tem que criar seu próprio componente, estendendo a classe e sobrescrevendo o método paintComponent.

Aqui tem um exemplo de como fazer isso.

querias usar da maneira q foi usado num projeto para renderizar as imagens das sprits game mas não entendo muito bem tenho uma baita dificuldade com inserção de imagem. o código e brande para postar aqui mas vou botar algo (nem todo código vai interessa aqui mas e para terem uma noção do q queria utilizar)…

//; variaveis
public JFrame frame;
public static final int WIDTH = 480;
public static final int HEIGHT = 320;
public static final int SCALE = 2;
public int fps = 0;
private Thread thread;
private boolean isRunning;
private BufferedImage image;
public static List entities;
public static List inimigos;
public static List tiros;
public static SpriteSheet spriteSheet;
public static Player player;
public static World world;
public static Random rand; // Foi criado na classe Game por que dai pode
//ser usado sempre q quiser, nao precisa ficar criando instancias.
public UI ui;

	public Game() {
		rand = new Random();
		this.addKeyListener(this);
		initFrame();
		// inicializando objetos
		ui = new UI();
		image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
		// import Araylist da biblioteca java.util!
		entities = new ArrayList<Entity>();
		inimigos = new ArrayList<Inimigos>();
		tiros = new ArrayList<Tiros>();
		spriteSheet = new SpriteSheet("/Spryte32Pixels.png"); // importante!
		player = new Player(0, 0, 32, 32, spriteSheet.getSpriteSheet(0, 0, 32, 32));
		entities.add(player);
		world = new World("/miniMapa.png");
	
	}

/// metodo render q esta na classe principal!!!
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
// importe graphics da biblioteca AWT;
Graphics g = image.getGraphics();
// Vamos inserir um plano de fundo com a cor verde no padrao RGB!
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);
// A baixo vamso trabalhar a renderização das imagens!

		world.render(g);// esse render() pertence a classe World!

		for (int i = 0; i < entities.size(); i++) {

			Entity e = entities.get(i);
			e.render(g);
		}
		
		for (int i = 0; i < tiros.size(); i++) {

			tiros.get(i).render(g);
		}
		// vamos por aqui para que ele seja renderizado acima de todas as imagens!
		ui.render(g);
		
		// dispose e um metodo de segurança que evita ceros rerros ou bugs!
		g.dispose();
		// O grafico g recebe como valor o grafico do BufferedStrategy!
		g = bs.getDrawGraphics();
		g.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
		
		// Fonte com as muniçoes exibido na tela!
		g.setFont(new Font("arial", Font.BOLD,20));
		g.setColor(Color.white);
		g.drawString("Munição: "+player.muniçao, 15, 60);
		// Fonte com o fps exibido na tela!
		g.setFont(new Font("Arial", Font.BOLD, 20));
		g.setColor(Color.BLACK);
		g.drawString("FPS: " + fps, (WIDTH * SCALE) - 100, (HEIGHT * SCALE) - 50);
		// Chama as BufferedImage
		bs.show();
	}

/// e o render da classe Word
public void render(Graphics g) {
// por q e o tamanho de cada tile!
int xstart = (Camera.x >> 5);
int ystart = (Camera.y >> 5);
//
int xfinal = xstart+(Game.WIDTH >> 5);
int yfinal = ystart+(Game.HEIGHT >> 5);

		for (int xx = xstart; xx <= xfinal; xx++) {
			for (int yy = ystart; yy <= yfinal; yy++) {
			// vamos usar um if, para caso der valores negativos em alguma das direções!
				
				if(xx<0 || yy<0 || xx>=WIDTH || yy>=HEIGHT) {
					continue;
				}
				
				Tiles tile = tiles[xx + (yy * WIDTH)];
				tile.render(g);
			}

		}
	}

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

Hum to entendendo melhor, tenho mais dificuldade talvez por causa da dislexia, não domino mas começo a entender, vcs poderia criar um projeto bem simples para mim, so com render de uma imagem sem as thread sem os outros componente s de jogo algo bem simples mesmo para mim?

Amigo, sofro do mesmo problema que o seu. O que me dificulta muito o aprendizado, não sei se para você isto vai funcionar mas algo que aprendi a fazer para que eu entenda códigos e novas linguagens de programação é utilizar a engenharia reversa. Ver um código pronto e procurar algum lugar que te mostre o que ele faz e você fazer o caminho inverso, normalmente isso nós ajuda a achar mais sentido nas coisas, e conseguir interligar os pontos pois nós que sofremos disso temos uma capacidade imensa de visualização criativa, então podemos implementar isso numa engenharia reversa para entender o real funcionamento. Ao invés de ver tutoriais que explicam passo a passo, pegue códigos prontos e veja sua funcionalidade e tente reproduzir ou editar.

1 curtida

bom adorei sua resposta e isso mesmo que faço esse método tirei por mim mesmo, tanto q pedi para outro colega daqui me mandar um projeto bem simples justamente para eu destrinchar rsrs , mas vindo de outra pessoa com o mesmo problema fico muito mais animado, Vlw Brother vou fazei isso sim.

1 curtida