this is a extra element for clear the floated element
J2ME手机游戏引擎程序结构简述
  • 12/31
  • 2008
嵌入式 | Java 2270 次查看
  1.使用Runnable和创建线程的主循环

  一般主体的做法就是让Displayable这个类实现Runnable这个接口,然后在其构造函数中创建一个线程,启动其run()函数,而run函数里面就包含了游戏的主循环。下面是我在仙剑里面的片断代码。

  publicclassGameMIDletextendsMIDlet{

  staticGameMIDletinstance;

  Displaydisplay;

  GameDisplayabledisplayable=null;

  publicGameMIDlet(){

  instance=this;

  display=Display.getDisplay(this);

  displayable=newGameDisplayable();

  }

  publicvoidstartApp(){

  display.setCurrent(displayable);

  }

  publicvoidpauseApp(){

  }

  publicvoiddestroyApp(booleanunconditional){

  displayable.running=false;

  }

  publicstaticvoidquitApp(){

  instance.destroyApp(true);

  instance.notifyDestroyed();

  instance=null;

  }

  }

  publicclassGameDisplayableextendsFullCanvasimplementsRunnable{

  /**主控制线程*/

  ThreadMainThread=null;

  /**游戏时钟间隔毫秒为单位*/

  publicstaticlongtimeinterval=20;

  publicstaticbooleanIsstable=true;

  /*用于游戏时钟的变量*/

  publicstaticlongtimeold=0;

  publicstaticlongtimenow=0;

  publiclonginterval=0;

  publicstaticlongframes_per_second=0;

  intcount=0;

  longsecond=0;

  publicstaticbooleanrunning=true;

  publicGameDisplayable(){

  //开始主线程

  ThreadMainThread=newThread(this);

  MainThread.start();

  }

  publicvoidrun(){

  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)必须保留,因为在Nokia60的手机上,如果去除了sleep(30),那么游戏将无法切换回来。同时,在游戏中任何一个内部循环中,也必须加入sleep(30)这个等待,才能让游戏可以切换回来,至于为什么这样做,我暂时还不清楚。30ms是我测试过没有问题的数值,可能比30ms还小的值也是没有问题的。

  同时,在MOTO的手机上,必须将游戏的主循环放在一个线程中,游戏才能切换回来,不过可以不加上面说的sleep(30)延时。

  2.不使用线程的主循环办法

  这个办法只能在Nokia的平台上实现,而我只建议在Nokia40的平台上做,这样不需要线程,道理上来说节约了一些内存,如果不是内存很紧张的机型,那么最好还是使用上一种办法。

  游戏的主循环放在MIDlet的class里面,具体做法如下:

  publicclassGameMIDletextendsMIDlet{

  GameDisplayabledisplayable=null;

  /**游戏时钟间隔毫秒为单位*/

  publicstaticlongtimeinterval=0;

  //用于游戏时钟的变量

  publicstaticlongtimeold=0;

  publicstaticlongtimenow=0;

  publiclonginterval=0;

  publicstaticlongframes_per_second=0;

  intcount=0;

  longsecond=0;

  publicstaticbooleanrunning=false;

  staticbooleanexitApp=false;

  publicGameMIDlet(){

  displayable=newGameDisplayable();

  running=true;

  }

  publicvoidstartApp(){

  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();

  }

  }

  publicvoidpauseApp(){

  running=false;

  }

  publicvoiddestroyApp(booleanunconditional){

  running=false;

  }

  publicstaticvoidquitApp(){

  running=false;

  exitApp=true;

  }

  }

  
您可能感兴趣的:

更多相关内容