出于某种原因,即使我在thread.sleep()
之前调用了渲染,我的图像也会在1秒后加载public void init (){
image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g= (Graphics2D) image.getGraphics();
running=true;
}
public void run (){
init();
while(running){
long start=System.nanoTime();
update();
render();
drawToScreen();
try{
thread.sleep(1000);
}
catch (Exception e){
e.printStackTrace();
}
}
}
public void update (){
}
public void render (){
g.clearRect(0, 0, WIDTH, HEIGHT);
g.setColor(Color.white);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(Color.red);
for(int r=0; r<16; r++){
for(int c=0; c<16; c++){
MazeCell m=maze[15-r][c];
int y=15-m.getRow();
int x=m.getCol();
if(m.getWallUp()) g.drawLine(x*50, y*50, (x+1)*50, y*50);
if(m.getWallDown()) g.drawLine(x*50, (y+1)*50, (x+1)*50, (y+1)*50);
if(m.getWallLeft()) g.drawLine(x*50, y*50, x*50, (y+1)*50);
if(m.getWallRight()) g.drawLine((x+1)*50, y*50, (x+1)*50, (y+1)*50);
}
}
g.drawImage(mouseImage, mouse.getCol()*50, (15-mouse.getRow())*50, null);
}
public void drawToScreen (){
Graphics g2=getGraphics();
g2.drawImage (image, 0, 0, null);
g2.dispose();
}
所有内容都会绘制,但首先会有一个空白的灰色屏幕,它只会在1秒后(线程休眠的时间)加载,即使先调用render和drawToScreen。我真的不知道原因。
答案 0 :(得分:0)
改变你的:
g2.dispose();
要:
g2.finalize();
此外,Graphics.drawImage()方法的说明指出:
绘制尽可能多的指定图像。在此图形上下文的坐标空间中,图像以其左上角(x,y)绘制。图像中的透明像素不会影响已存在的任何像素。 此方法在所有情况下都会立即返回,即使尚未加载完整图像,也没有为当前输出设备进行抖动和转换。
如果图像已完全加载且其像素不再被更改,则drawImage将返回true。否则,drawImage返回false,并且随着更多图像变得可用或是时候绘制另一帧动画,加载图像的过程会通知指定的图像观察者。
换句话说,无论图像绘制是否完成,呼叫都会立即返回。
您可以使用MediaTracker在调用Graphics.drawImage()之前首先确保已加载图像:
long timeout = 60000; // 60 seconds
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 0);
try {
if (!tracker.waitForID( 0, timeout ) ) {
System.out.println( "Timed Out!" );
return;
}
}
catch( Exception ex) {
System.out.println( "Error waiting for the image to load." );
return;
}
boolean isFinished = g.drawImage(image, 0, 0, this);