问题描述
因此,我正在使自己成为一个简单的小型2D游戏引擎,以了解有关Java swing的更多信息,并可以将其用于将来的项目。我有一个名为Canvas
的类,它扩展了JPanel
,并将包含所有用于渲染精灵的代码,等等。现在,我有一个名为paintSprites()
的方法,它将通过以下所有绘制步骤:每个精灵,它将管理背景颜色并将其绘制到BufferedImage
对象(有点像双重缓冲),然后在我的paintComponent()
方法中,它仅将此BufferedImage
对象绘制到屏幕。仅出于测试目的,在我的paintSprites()
方法中,我只是在绘制一个绿色正方形。但是,当我运行该程序时,将显示该窗口,但它完全是空白的。这是我的代码:
package gui;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.image.BufferedImage;
import game.Game;
public class Canvas extends JPanel implements Runnable{
private Color background = Color.WHITE;
private double targetFPS = 60.0;
private Thread renderer;
private boolean render = true;
private Game parent;
private BufferedImage temp;
public Canvas(Game parent){
super();
this.parent = parent;
renderer = new Thread(this);
renderer.start();
}
public void setBackgroundColor(Color c){
background = c;
}
public void startRendering(){
render = true;
}
public void stopRendering(){
render = false;
}
public void setTargetFPS(double d){
targetFPS = d;
}
public void paintComponent(Graphics g){
g.setColor(background);
g.fillRect(0,getWidth(),getHeight());
g.drawImage(temp,null);
System.out.println("Painted Component");
}
public BufferedImage paintSprites(){
BufferedImage out = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);
out.getGraphics().setColor(Color.WHITE);
out.getGraphics().fillRect(0,getHeight());
out.getGraphics().setColor(Color.GREEN);
out.getGraphics().fillRect(10,10,50,50);
out.getGraphics().dispose();
return out;
}
public void run(){
while(true){
if(!render) continue;
try{Thread.sleep((long)(1000.0/targetFPS));} catch(InterruptedException ex){}
BufferedImage dbImage = paintSprites();
temp = dbImage;
repaint();
}
}
}
(另外,我认为这可能与缓冲的图像类型有关,因为当我将其更改为TYPE_INT_RGB
时,窗口的背景为黑色,带有白色正方形,但是我尝试了不同的图像类型,似乎没有任何作用。
解决方法
根据tutorial的建议,将paintSprites()
从getGraphics()
更改为createGraphics()
:
public BufferedImage paintSprites() {
BufferedImage out =
new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D g = out.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,getWidth(),getHeight());
g.setColor(Color.GREEN);
g.fillRect(100,100,50,50);
g.dispose();
return out;
}
但是我找不到解释原因的资源。