新客网
首页 | 新闻 | 系统·网络·服务器·安全 | 工具·办公 | 编程·数据库 | 图象·网页·运营 | 硬件·存储 | 专题教程 | 旧版
 → 当前位置:首页 > 教程 > 编程开发 > JAVA > 正文

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

XKER.COM   2006-5-11 9:57:34  来源:j2me开发网  点击:

游戏引擎的结构很多,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。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;
 }

}
上一篇教程:Java编程中的经验教训
下一篇教程:Java列表对象的性能分析
收藏本文】 【我要投稿】 【打印本文】 【论坛讨论】 【关闭窗口

相关文章
·J2ME程序开发新手入门九大要点·J2ME内存占用详解及优化方法
·J2ME游戏开发的高级优化技巧

学院文章搜索
  
推荐文章
·编程过把瘾:自己动手写操
·数据恢复指南 专题
·硬盘“逻辑锁”解决办法
·DOS使用中的常见问题解答
·DOS下常用的相关网络命令
·Win2000优化技巧篇之:硬件
·惊心8小时:破译Windows运行
·菜鸟必备:超实用低级格式
·硬件有价数据无价 硬盘开盘
·国内数据恢复市场内幕揭秘
阅读排行
·免费代理IP(每日更新)
·DB2 9数据库专题
·关于 Apache 的几种常见应
·QQ千人好友浮出水面 会员抢
·佳能活动 免费得QQ秀
·站长手册:WIN2003下Web服
·网站投资你和我的20个自身
·140天,从做站起步到日赚1
·克隆软件Ghost初级使用教程
·Fdisk分区详解
专题教程
·数据恢复指南 专题
·Web服务器专题
·DB2 9数据库专题
·ghost教程 专题
·局域网技术专题
·虚拟机专题
·CDN加速技术专题
·注册表教程专题
·电脑技巧 专题
·Linux与虚拟化技术
最新文章
·Firefox出现新高危0Day漏洞
·QQ千人好友浮出水面 会员抢
·DOS下对系统重新进行分区
·Fdisk分区详解
·DOS常用命令
·dos如何进行系统配置
·dos慎用命令
·Ver、Vol、Ctty命令使用说
·Tree、Unformat、Vsafe命令
·Setver、Share、Subst命令
设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003 - 2006 XKER Inc. All Rights Reserved
新客网 版权所有