51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2055|回复: 0
打印 上一主题 下一主题

J2ME手机游戏引擎程序结构简述

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-11-14 14:46:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    游戏引擎的结构很多,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2ME的程序一般都包含两个class文件,一个是MIDlet,一个是Displayable。一般我都是把游戏的主要代码放在Displayable这个类里面。这个类是基于事件驱动的程序,有三个主要相应函数void paint(Graphics g),void keyPressed(int keyCode),void keyReleased(int keyCode)。
    1、使用Runnable和创建线程的主循环
    一般主体的做法就是让Displayable这个类实现Runnable这个接口,然后在其构造函数中创建一个线程,启动其run()函数,而run函数里面就包含了游戏的主循环。下面是我在仙剑里面的片断代码。
    public class GameMIDlet extends MIDlet {
    static GameMIDlet instance;
    Display display;
    GameDisplayable displayable = null;
    public GameMIDlet() {
    instance = this;
    display = Display.getDisplay(this);
    displayable = new GameDisplayable();
    }
    public void startApp() {
    display.setCurrent(displayable);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    displayable.running = false;
    }
    public static void quitApp() {
    instance.destroyApp(true);
    instance.notifyDestroyed();
    instance = null;
    }
    }
    public class GameDisplayable extends FullCanvas implements Runnable {
    /** 主控制线程 */
    Thread MainThread = null;
    /** 游戏时钟间隔 毫秒为单位 */
    public static long timeinterval = 20;
    public static boolean Isstable = true;
    /* 用于游戏时钟的变量 */
    public static long timeold = 0;
    public static long timenow = 0;
    public long interval = 0;
    public static long frames_per_second = 0;
    int count = 0;
    long second = 0;
    public static boolean running = true;
     public GameDisplayable() {
    // 开始主线程
    Thread MainThread = new Thread(this);
    MainThread.start();
    }
    public void run() {
    while (running) {
    timenow = System.currentTimeMillis();
    interval = timenow - timeold;
    if (interval >= timeinterval) {
    timeold = timenow;
    Game_Process();
    if (second != (System.currentTimeMillis() / 1000)) {
    second = System.currentTimeMillis() / 1000;
    frames_per_second = count;
    count = 1;
    }
    else
    count++;
    }
    lib.sleep(30);
    }
    }
    其中关于控制主循环速度的代码可以不要,但是lib.sleep(30)必须保留,因为在Nokia 60的手机上,如果去除了sleep(30),那么游戏将无法切换回来。同时,在游戏中任何一个内部循环中,也必须加入sleep(30)这个等待,才能让游戏可以切换回来,至于为什么这样做,我暂时还不清楚。30ms是我测试过没有问题的数值,可能比30ms还小的值也是没有问题的。
    同时,在MOTO的手机上,必须将游戏的主循环放在一个线程中,游戏才能切换回来,不过可以不加上面说的sleep(30)延时。
    2、不使用线程的主循环办法
    这个办法只能在Nokia的平台上实现,而我只建议在Nokia 40的平台上做,这样不需要线程,道理上来说节约了一些内存,如果不是内存很紧张的机型,那么最好还是使用上一种办法。
    游戏的主循环放在MIDlet的class里面,具体做法如下:
    public class GameMIDlet extends MIDlet {
    GameDisplayable displayable = null;
    /** 游戏时钟间隔 毫秒为单位 */
    public static long timeinterval = 0;
    //用于游戏时钟的变量
    public static long timeold = 0;
    public static long timenow = 0;
    public long interval = 0;
    public static long frames_per_second=0;
    int count=0;
    long second =0;
    public static boolean running = false;
    static boolean exitApp =false;
    public GameMIDlet() {
    displayable = new GameDisplayable();
    running =true;
    }
    public void startApp() {
    running =true;
    Display.getDisplay(this).setCurrent(displayable);
    while(running) {
    timenow = System.currentTimeMillis();
    interval = timenow - timeold;
    if (interval >= timeinterval) {
    timeold = timenow;
    displayable.Game_Process();
    if(second != (System.currentTimeMillis() /1000)){
    second = System.currentTimeMillis()/1000;
    frames_per_second = count;
    count = 1;
    }else
    count ++;
    }
    }
    if(exitApp) {
    destroyApp(true);
    notifyDestroyed();
    }
    }
    public void pauseApp() {
    running =false;
    }
    public void destroyApp(boolean unconditional) {
    running = false;
    }
    public static void quitApp() {
    running =false;
    exitApp =true;
    }
    }
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 19:43 , Processed in 0.062441 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表