使用线程构造游戏循环

作者:潇潇  出处:www.j2mefans.com
该文章为本站原创,如有引用,请注明出处和作者

    我们知道了MIDlet运行框架,就可以学习j2me编成的其他细节了,就可以在框架,和画布上绘制我们需要的东西了。
    
但是在讲解这部分之前,我们还是先和大家一起讨论一个更为重要的内容那就是游戏循环。为什么游戏循环很重要呢?我们知道动画的根本原理就是快速的绘制一幅
幅连续的但内容相近的图片,依靠人的视觉暂留效果而完成的。也就是说动画或游戏的根本就是根据就是根据玩家的输入或剧本的规定去绘制场景,绘制精灵。其中
只有场景的变化,和精灵的不同,但根本上说都是根据不同的状态使用同样的来绘制图像,来构建场景。所以我们就可以使用一个游戏循环,并在其中使用同样的绘
图方法来绘制不同的图像,进而形成动画。如果再添加上玩家的输入,并根据玩家的输入来移动精灵,那么是否就是游戏的雏形呢?
    知道了游戏循环的重要性,下面我们就构造一个游戏循环。
    主要的修改在Ocanvas类中。我们先使用MIDP1.0的方法构造一个游戏循环:


/**
*  文件名:Ocanvas.java
*  画布类
*/

import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;

public class OCanvas extends Canvas implements Runnable
{
    //定义变量
    private Display display;
    private boolean sleeping;
                private long    frameDelay;

    private int     XSpeed,YSpeed;
                private int     x,y;

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

        // 设置帧频 (30 fps),他决定了游戏画面的绘制快慢,至少为24帧
        frameDelay = 33;
    }

    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() {
         // 动画线程开始后运行
            
        // 主游戏循环
        while (!sleeping) {//在while循环中使用下面两个函数来构建一个游戏循环
             //更新游戏中的数据变量
            update();
            //更新屏幕显示
            repaint();
            //线程休眠
             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;
     
    }
    
    //这里添加对屏幕的绘制
    public void paint(Graphics g)
    {
        // 清除屏幕
        g.setColor(0xffffffff);
        g.fillRect(0, 0, getWidth(), getHeight());
    
        // 重绘屏幕
        g.setColor(0,0,0);
        g.fillRect(x,y,20,20);
        
    }
}

有了这个游戏循环,我们就可再在两个函数中进行主要的修改了,update()函数中主要负责更新游戏或动画中精灵的位置和状态;paint()函数再根据update中对精灵位置和状态的更新进行相应的绘制。