Olá eu tenho um JPanel e um JFrame que funcionam perfeitamente, porém quando tento adicionar o paintComponent para colcoar minha imagem a tela que foi definida por mim como preta, fica cinza(como se não tivesse background)... qual seria o problema?
Estou desesperado vou postar meu código inteiro, Vinicius não consegui fazer a imagem funcionar usando Media Tracker, eu sei que você é especialista em jogos e gostaria que você me desse um exemplo à partir de meu código. Como eu posso adicionar uma imagem , que seria para um joguinho...
Meu código:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */importjavax.swing.*;importjava.awt.*;importjava.awt.Toolkit.*;/** * * @author Usuario */classPanelextendsJPanel{publicPanel(){this.setPreferredSize(newDimension(400,325));this.setBackground(newColor(0,0,0));}}publicclassJogoextendsJFrame{publicJogo(){this.setTitle("Joguinho");this.setSize(400,325);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Panelp=newPanel();this.add(p);}publicstaticvoidmain(String[]args){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newJogo().setVisible(true);}});}}
Aproveitando a deixa: em um jogo é melhor sobreescrever o método paint() ou o método paintComponent() para fazer a renderização? Qual a diferença na prática?
G
GustavoSilva
Aqui diz: cannot find symbol “read”.
BufferedImage player = ImageIO.read(“player.png”);
M
marcobiscaro2112
Troque por:
BufferedImage player = ImageIO.read(getClass().getResource("player.png"));
G
GustavoSilva
Marcos aqui diz:
“Unreported exception java.io.IOException; must be caught or declared to be trown”
Pra essa linha que você me enviou.
ViniGodoy
Se você fizer um filho de JComponent, você deve sobrescrevem paintComponent. Se fizer um filho de JFrame ou JApplet, você deve sobrescrever o método paint. Entretanto, a melhor forma mesmo é adotar uma técnica conhecida como escrita direta. Vou explicar sobre isso nos próximos artigos, mas consiste em basicamente obter o objeto BufferStrategy e, você mesmo, chamar os métodos para atualizar os buffers de pintura.
Isso porque o Swing não reaje a um repaint instantaneamente. E ele também pode ignorar repaints dados em intervalos de tempo muito próximos (event coalescing). Essas características são muito boas para UIs, mas péssimas para jogos.
ViniGodoy
GustavoSilva:
"Unreported exception java.io.IOException; must be caught or declared to be trown"
Faça assim:
publicBufferedImageplayer=loadImage("player.png");publicstaticBufferedImageloadImage(Stringname){try{returnImageIO.read(newFile(name));//Ou getClass().getResource(name), caso você queira que essa imagem vá ficar depois dentro do .jar}catch(Exceptione){thrownewRuntimeException("Não foi possível carregar "+name,e);}}
M
marcobiscaro2112
Se você fizer um filho de JComponent, você deve sobrescrevem paintComponent. Se fizer um filho de JFrame ou JApplet, você deve sobrescrever o método paint. Entretanto, a melhor forma mesmo é adotar uma técnica conhecida como escrita direta. Vou explicar sobre isso nos próximos artigos, mas consiste em basicamente obter o objeto BufferStrategy e, você mesmo, chamar os métodos para atualizar os buffers de pintura.
Isso porque o Swing não reaje a um repaint instantaneamente. E ele também pode ignorar repaints dados em intervalos de tempo muito próximos (event coalescing). Essas características são muito boas para UIs, mas péssimas para jogos.
Entendi, obrigado.
Mas BufferStrategy não é usado somente em Window e Canvas? E se minha classe onde o jogo é desenhado extender JPanel, por exemplo?
ViniGodoy
Nesse caso, é no paintComponent mesmo. Mas, a menos que seu jogo não ocupe a janela inteira (o que é muito raro), não tem pq estender JPanel ou JComponent.
G
GustavoSilva
Vinicius eu não sei se o problema é comigo mas seu código me levou à isso: