关于Java动态应用双缓冲实现学习记录

       之前曾尝试书写一些小游戏,但是出来的效果却不尽如人意,问题最明显的是画面闪烁问题,在查阅相关资料后,解决方式中比较有趣的便是双缓冲。

        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);
}
第一次写博文,如有错误希望指正,谢谢。 微笑



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值