当前页面: 开发资料首页 → 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);
}