作者:潇潇  出处:www.j2mefans.com

该文章为本站原创,如有引用,请注明出处和作者

对 于MIDP2.0来说构造游戏循环的方法是相同的,但也有区别。因为MIDP2.0使用GameCanvas类,该类不同于Canvas类,在于它的特 性,因为它本身支持双缓冲区(这一点我们将在后面的文章里提到),所以,他的绘图函数部分就和Canvas类不相同。其中第一点不同在于,名称,使用 GameCanvas类我们不必非的使用paint()函数绘制图像,我们可以根据自己的爱好给她取名;第二点,因为Canvas类的paint()方法 中有Graphics类的一个实例作为参数,所以我们可以直接使用该参数进行绘图。但是使用GameCanvas类后,因为绘图函数是自己定义的,所以我 们还得使用Graphics g = getGraphics();语句得到一个Graphics类的实例;第三点,因为使用双缓冲区,也就是说,绘图不 是直接作用于屏幕,所以我们还得使用flushGraphics();来强制将屏幕缓冲区的内容绘制到屏幕上。
看看下面的例子:
/**
*  文件名:Ocanvas.java
*  画布类
*/


import javax.microedition.lcdui.*;
//MIDP2.0要添加下面的库import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;

public class OCanvas extends GameCanvas implements Runnable  {
  
  //定义变量
  private Display display;
  private boolean sleeping;
  private long    frameDelay;
  
  private int     x,y;
  private int     XSpeed , YSpeed; 

  public OCanvas(Display d) {
      //类构造函数,初始化类变量
    super(true);
    display = d;

    // 设置帧频 (30 fps)
    frameDelay = 33;
  }
  
  public void start() {
    
    // 设置这个画布为当前屏幕
    display.setCurrent(this);
    
    // 初始化一些游戏中的变量,载入相关图片
    x=getWidth()/2-10;
    y=getHeight()/2-10; 
     XSpeed = YSpeed = 3;
    

    // 开始动画线程
    sleeping = false;
    Thread t = new Thread(this);
    t.start();
  }
  
  public void stop() {
    // 停止动画线程
    sleeping = true;
  }
  
  public void run() {
     // 动画线程开始后运行        
    //得到Graphics类的一个实例,才能绘制图像
    Graphics g = getGraphics();
    
    // 主游戏循环
    while (!sleeping) {
      //更新游戏中的数据变量
      update();
      //更新屏幕显示,我们自定义的draw函数
      draw(g);
      //线程休眠
      try {
        Thread.sleep(frameDelay);
      }
      catch (InterruptedException ie) {}
    }
  }
  
  //在这里更新游戏中的数据变量
  private void update() {
   
     x=XSpeed+x;
     y=YSpeed+y;
    if (x < 0)
              x=getWidth();
    if(x>getWidth())
                x=0;
     if (y < 0)
             y=getHeight();
    if(y>getHeight())
                y=0;
     
  }
  
  //在这里对屏幕进行绘制
  private void draw(Graphics g) {
    // 清除屏幕
    g.setColor(0xffffffff);
    g.fillRect(0, 0, getWidth(), getHeight());
    
    // 重绘屏幕
    g.setColor(0,0,0);
    g.fillRect(x,y,20,20);
    // 刷新屏幕缓冲区
    flushGraphics();
  }

}
这里我们使用了简单的绘制方块的函数,使方块在游戏循环中不断地变换位置,形成一个动画。