之前曾尝试书写一些小游戏,但是出来的效果却不尽如人意,问题最明显的是画面闪烁问题,在查阅相关资料后,解决方式中比较有趣的便是双缓冲。
Java中,当继承绘图功能的子类需要连贯变化的窗口,一般的刷新会调用update(Graphics g)进行刷新,而此时若刷新较快,显示器更不上刷新速度就会出现闪烁现象,解决方式如下(以我的就觉过程为例):
private Image iBuffer;//缓冲区:用于承载画面
private Graphics gBuffer;//缓冲区画笔
public void paint(Graphics g) {
if(iBuffer==null) {
iBuffer=createImage(this.getSize().width,this.getSize().height);
gBuffer=iBuffer.getGraphics();
}//创建缓冲区
//缓冲区绘图
gBuffer.setColor(Color.GRAY);
gBuffer.fillRect(0, 0, Width, Height);
gBuffer.setColor(new Color(249,214,91));
gBuffer.fillRect(blank/2, blank/2+10, Width-blank, Height-blank);
gBuffer.setColor(Color.BLACK);
gBuffer.fillOval(blank/2+9*(linewidth+Tile)-5,blank/2+10+9*(linewidth+Tile)-5,10, 10);
gBuffer.fillOval(blank/2+3*(linewidth+Tile)-4,blank/2+10+3*(linewidth+Tile)-4, 8,8);
gBuffer.fillOval(blank/2+9*(linewidth+Tile)-4,blank/2+10+3*(linewidth+Tile)-4, 8,8);
gBuffer.fillOval(blank/2+15*(linewidth+Tile)-4,blank/2+10+3*(linewidth+Tile)-4, 8, 8);
gBuffer.fillOval(blank/2+3*(linewidth+Tile)-4,blank/2+10+9*(linewidth+Tile)-4,8, 8);
gBuffer.fillOval(blank/2+15*(linewidth+Tile)-4,blank/2+10+9*(linewidth+Tile)-4, 8,8);
gBuffer.fillOval(blank/2+3*(linewidth+Tile)-4,blank/2+10+15*(linewidth+Tile)-4, 8,8);
gBuffer.fillOval(blank/2+9*(linewidth+Tile)-4,blank/2+10+15*(linewidth+Tile)-4,8,8);
gBuffer.fillOval(blank/2+15*(linewidth+Tile)-4,blank/2+10+15*(linewidth+Tile)-4,8,8);
for(int i=0;i<row;i++) {
gBuffer.fillRect(blank/2+i*(linewidth+Tile),blank/2+10,linewidth,lineheight);
}
for(int i=0;i<col;i++) {
gBuffer.fillRect(blank/2,blank/2+10+i*(linewidth+Tile),lineheight,linewidth);
}
for(int i=0;i<col;i++)
for(int j=0;j<row;j++)
if(panel[i][j]!='#')paintPiece(j+1,i+1,gBuffer,panel[i][j]);
g.drawImage(iBuffer,0,0,this);
//在窗口加载缓冲区}
所以大致框架为:
Image iBuffer=creatImage(width,height);
Grapgics gBuffer=iBuffer.getGraphics()
paint(Graphics g){
//gBuffer 绘图。。。。
g.drawImage(iBuffer,x,y,this);
}
第一次写博文,如有错误希望指正,谢谢。