一、问题描述
我们在做有关于图形绘制方面的问题非常之多。比如,有时我们用普通的方法去绘制图形,会产生闪屏的现象,导致我们所做的游戏或者是别的项目效果非常差,这完全不是我们想要的结果。那么,有没有一种技术,实现不闪屏的效果,特别是在多线程环境下。答案是有的,这就是Java的什么技术——双缓冲技术。
图1 双缓冲技术效果图
二、实现方法
1、首先,我们定义一个类继承JFrame,要自定义绘图,我们就要实现JFrame的paint()方法,如下:
@Override
public void paint(Graphics g) {
}
2、创建一个缓冲区画笔;
public BufferedImage(int width,
int height,
int imageType)
width 缓冲区的宽度
height 缓冲区的高度
imageType 缓冲图形模式
// 创建一个缓冲区
BufferedImage paint = new BufferedImage(width, height,
BufferedImage.TYPE_3BYTE_BGR);
// 得到缓冲区的画笔
Graphics g2 = paint.getGraphics();
3、将你想要绘制的图形绘制在缓冲区内;
// 将想要绘制的图形绘制到缓冲区
g2.drawImage(GameImage.getInstance().game_main_bg, 0, 0, width, height,
this);
4、将缓冲区的图形绘制到显示面板上;
g.drawImage(paint, 0, 0, this);
经过上面四步之后,我们就解决了闪屏的问题,现在放心大胆的去做你的游戏吧!
三、项目源码
由于项目过大,源码只给出了双缓冲技术得用法,具体的实现并没有做。如果想验证源码的,可以联系我要项目所用到的图片,也可以上网查找。
由于技术和能力有限,文中难免会有错误之处,还望指正,谢谢合作!
1、程序入口类Main.java
/**
* 主函数入口
* @author Admin
*
*/
public class Main {
public static void main(String[] args) {
new MainGameFrame();
}
}
2、游戏主界面类MainGameFrame.java
/**
* 游戏主面板
*
* @author Admin
*
*/
public class MainGameFrame extends JFrame implements Runnable {
private int width = 1200;
private int height = 600;
private BufferedImage clickGame;
private List<PlantAutoMoveInfo> allPlant;
private boolean isRunnableStart;
public MainGameFrame() {
isRunnableStart =