最近小编在做
Java
小游戏时,遇到了一个问题,我让人物动起来时,画面卡到惨不忍睹。
这是为什么呢?
后来百度了一下,发现是需要用到双缓冲
它主要是和线程的睡眠时间有关,睡眠时间越短,闪烁显现就越严重。是因为显示器的刷新频率高于程序。paint方法还没有来得及画完整幅画面,所以就出现了闪烁问题。
这里我们就需要使用双缓冲消除,先把所有东西画在虚拟屏幕上
,
前面什么都不画,然后一次性把画好的内容显示出来。
所谓双缓冲,就是在内存中开辟一片区域,作为后台图象,程序对它进行更新、修改,绘制完成后再显示到屏幕上。
重载update(Graphics g)方法
public void update(Graphics g)
{
GraphicsDemo.screenImage = this.createImage(15*30, 15*30);
Graphics gps = GraphicsDemo.screenImage.getGraphics();
Color c = gps.getColor();
gps.setColor(Color.GRAY);
gps.fillRect(0, 0,800,600);
gps.setColor(c);
paint(gps);
g.drawImage(GraphicsDemo.screenImage, 0, 0, null);
}
public void paint(Graphics g)
{
super.paint(g); //调用super.paint(g)去清楚运动的痕迹
int i,j;
Image img = Toolkit.getDefaultToolkit().getImage("images\\metalWall.png");
Image img1 = Toolkit.getDefaultToolkit().getImage("images\\enemy_2.gif");
Image img2 = Toolkit.getDefaultToolkit().getImage("images\\dot.gif");
Image img3 = Toolkit.getDefaultToolkit().getImage("images\\eater_0_2.gif");
Font f = g.getFont();
g.setFont(new Font("TimesRoman" , Font.BOLD , 20));
g.drawString("剩余生命值: ", 500, 70);
String count1 = " " +GraphicsDemo.count;
g.drawString(count1 ,610, 70);
for( i = 0;i<15;i++)
{
for( j = 0; j<15;j++)
{
if(GraphicsDemo.map[i][j] == 1)
{
// g.drawRect((j)*30, (i)*30, 30, 30);
//将围墙画上去
g.drawImage(img, (j)*30, (i)*30, 30, 30, Color.LIGHT_GRAY, this);
}
if(GraphicsDemo.map[i][j] == 2)
{
//先将一个敌人画上去
g.drawImage(img1, (j)*30, (i)*30, 20, 20, Color.LIGHT_GRAY, this);
}
if(GraphicsDemo.map[i][j] == 4)
{
//将点画上去
g.drawImage(img2, (j)*31, (i)*31, 6, 6, Color.LIGHT_GRAY, this);
}
if(GraphicsDemo.map[i][j] == 3)
{
g.drawImage(img3, (j)*30, (i)*30, 20, 20, Color.LIGHT_GRAY, this);
}
}
}
repaint();
try {
Thread.sleep(10);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
第一次没有加super.paint(g)时,发现运行时还是会出现闪烁情况,后面运行后就可以了。小编特意把repaint() 和try块分别注释发现不会有影响,最关键的问题在与super.paint(g);