使用双缓冲区实现的一个小球碰壁Applet

//使用双缓冲区
//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;

  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() {
    newThread = new Thread(this);//建立新线程
    newThread.start();
  }

  public void stop() {
    newThread = null;//将线程设为空
  }

  public void paint(Graphics g) {
    if (width != getSize().width || height != getSize().height)
    {
      //如果Applet大小变化就重新生成次画面
      width = getSize().width;
      height = getSize().height;
      OffScreen = createImage(width, height);
      drawOffScreen = OffScreen.getGraphics();
    }
    //清除次画面(即在次画面上绘制一个与与Applet相同大小的矩形)
    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);
//    g.setColor(Color.white);
//   g.fillOval(X, Y, 30, 30);
  }

  public void update(Graphics g)
  {
    //update函数只调用paint()函数而不是清除后再调用
    paint(g);
  }

  public void run() {
    while (newThread != null) {
      repaint();//重新绘制图像
      try {
        Thread.sleep(50);//线程暂停50毫秒
      }
      catch (InterruptedException E) {}
      X = X + moveX;//重新计算X、Y坐标
      Y = Y + moveY;
      //碰到边界时改变递增值造成反弹效果
      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;
      }
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值