站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题java动画——使用双缓冲区

java动画——使用双缓冲区

摘要: java动画——使用双缓冲区
java动画——使用双缓冲区



// 程序:使用双缓冲区

// 范例文件:UseDoubleBuffering.java



import java.awt.*;

import java.applet.*;



public class UseDoubleBuffering extends Applet implements Runnable

{

int X,Y,moveX,moveY,width,height;

Thread newThread; //新线程



Image OffScreen; //次画面

Graphics drawOffScreen; //绘制次画面的Graphics实体



public void init()

{

X = 0; //X坐标

Y = 0; //Y坐标

moveX = 2; //X轴移动距离

moveY = 3; //Y轴移动距离

width = getSize().width; //Applet的宽度

height = getSize().height; //Applet的高度



OffScreen = createImage(width,height); //建立次画面

drawOffScreen = OffScreen.getGraphics(); //取得次画面的绘制类

}



public void start() //start()函数

{

newThread = new Thread(this); //建立与启动新线程

newThread.start();

}



public void stop() //stop()函数

{

newThread = null; //将线程设为null

}



public void paint(Graphics g)

{

//下面这两行的作用为清除次画面

drawOffScreen.setColor(Color.black);

drawOffScreen.fillRect(0,0,width,height);



//下面这两行的作用为在次画面上绘制实心正圆形

drawOffScreen.setColor(Color.white);

drawOffScreen.fillOval(X,Y,30,30);



//将次画面贴到主画面上

g.drawImage(OffScreen,0,0,this);

}



public void update(Graphics g) //update()函数

{

paint(g); //只单纯调用paint()函数

}



public void run()

{

while(newThread != null) //动画循环

{

repaint(); //重新绘制图像



try

{

Thread.sleep(50); //暂停程序执行50毫秒

}

catch(InterruptedException E){ }



X = X + moveX; //计算新的X坐标

Y = Y + moveY; //计算新的Y坐标



//碰撞到边界时就会反弹

if(X >= (width - 30))

{

X = width - 30;

moveX = -moveX;

}

if(X <= 0)

{

X = 0;

moveX = -moveX;

}

if(Y >= (height - 30))

{

Y = height - 30;

moveY = -moveY;

}

if(Y <= 0)

{

Y = 0;

moveY = -moveY;

}

}

}

}





因为显示图像本身就是一个很慢的过程,所以如果我们现在内存中绘制好下衣服要显示的图像,我们只要将要显示的图像指针指向这个内存,就比前一种方法更快些,效果更好些。我们将这种方法称为双缓冲法。

为了直线这个目的我们可以看到在示例代码中,使用了createImage()方法来创建一个图像,这也就是我么所说的第二个缓冲区。

OffScreen = createImage(width,height); //建立次画面

drawOffScreen = OffScreen.getGraphics(); //取得次画面的绘制类

这样我们同样在线程中计算位置。但可以使他的停滞时间更短。

并在paint()方法中显示:

public void paint(Graphics g)

{

//下面这两行的作用为清除次画面

drawOffScreen.setColor(Color.black);

drawOffScreen.fillRect(0,0,width,height);



//下面这两行的作用为在次画面上绘制实心正圆形

drawOffScreen.setColor(Color.white);

drawOffScreen.fillOval(X,Y,30,30);



//将次画面贴到主画面上

g.drawImage(OffScreen,0,0,this);

}






↑返回目录
前一篇: java动画——使用线程播放动画
后一篇: java动画——连续图像绘制