该文章为本站原创,如有引用,请注明出处和作者
对 于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();
}
}
这里我们使用了简单的绘制方块的函数,使方块在游戏循环中不断地变换位置,形成一个动画。