开发学院软件开发Java 游戏框架之心得体会 阅读

游戏框架之心得体会

 2007-12-23 12:29:22 来源:WEB开发网   
核心提示: 游戏框架之心得体会(1) 最近研究的一段时间的游戏代码,获益不小!细节的掌握不多,游戏框架之心得体会,但对游戏的框架有了一定的了解, 现总结出几套游戏框架,在此写出供大家参考! 文章仅代表个人观点,如有观点请在论坛讨论 MSN alfylove@hotmail.com文章出自 J2MEDEV 转载请注名出处

                         游戏框架之心得体会(1)

  最近研究的一段时间的游戏代码,获益不小!细节的掌握不多,但对游戏的框架有了一定的了解。
    现总结出几套游戏框架,在此写出供大家参考!
    文章仅代表个人观点,如有观点请在论坛讨论

  MSN alfylove@hotmail.com


文章出自 J2MEDEV 转载请注名出处


 合金代码 下载地址 http://www.j2medev.com/Soft/src/game/200610/789.Html

Mid.java
 开始启动线程
 
public class Mid extends MIDlet implements Runnable

public Mid() {
   mscreen = new Game();
   Display.getDisplay(this).setCurrent(mscreen);
  }

  public void run(){
   if(mscreen.PRocess()) this.notifyDestroyed();
  }
 
  public void startApp() {
   (new Thread(this)).start();
  }
 
  public void pauseApp() {
   mscreen.stayapp();
  }

  public void destroyApp(boolean unconditional) {
   mscreen.exitapp();
  }
}

   //游戏主体部分
Game.java

public class Game extends Canvas {

   public MScreen() {  
   face_load();//地图数据
   sound_load();//声音载入
   screen_index = SCREEN_RESSLOAD; //这个索引为游戏主索引
  }
  /////////////////////////////////
  ///////技巧部分/////////
  ///////////////////////////////
  public final void refresh() { repaint(); serviceRepaints(); } //刷新屏幕
  public final void stayapp() { running = false; }  //退出循环
  public final void exitapp() { exitapp = true; }  //退出程序
 
  //相对坐标的转换
  private final int toScreenx(int x) { return x - position_x; }
  private final int toScreeny(int y) { return y - position_y; }
 
 
 ////////////////////////////////////////////
 /////////              ////////////
 ////////   描绘           ////////////
 ////////////////////////////////////////////
 protected void paint(Graphics g) {
   if(process_lock) return; //游戏关键进程锁
   g.setClip(0,0,screen_w, screen_h);
   process_draw();
  }
 
 protected void process_draw() {
   if(process_lock) return;
   switch(screen_index){
    case SCREEN_MAINMENU: mainmenu_draw(); break;
    case SCREEN_HELPINFO: helpinfo_draw(); break;
    case SCREEN_COPYRIGH: copyrigh_draw(); break;
    case SCREEN_GAMEBODY: gamebody_draw(); break;
    case SCREEN_GAMEOVER: gameover_draw(); break;
    case SCREEN_HIGHLIST: highlist_draw(); break;
    case SCREEN_RESSLOAD: ressload_draw(); break;
    case SCREEN_SELEGATE: selegate_draw(); break;
   }
  }
 


 
//////////////////////////////////////////////
///////////////  按键处理//////////////
////////////////////////////////////////////
  protected void keyPressed(int keyCode) {
   setkeystate(keyConvert(keyCode), true);
   process_key(keyConvert(keyCode));
  }

  protected void keyRepeated(int keyCode) {
   setkeystate(keyConvert(keyCode), true);
  }
  protected void keyReleased(int keyCode) {
   setkeystate(keyConvert(keyCode), false);
  }
 
protected final void process_key(int keycode){
   if(process_lock) return;
   switch(screen_index){
    case SCREEN_GAMEBODY: gamebody_key(keycode); break;
    case SCREEN_MAINMENU: mainmenu_key(keycode); break;
    case SCREEN_HELPINFO: helpinfo_key(keycode); break;
    case SCREEN_COPYRIGH: copyrigh_key(keycode); break;
    case SCREEN_GAMEOVER: gameover_key(keycode); break;
    case SCREEN_HIGHLIST: highlist_key(keycode); break;
    case SCREEN_SELEGATE: selegate_key(keycode); break;
    case SCREEN_RESSLOAD: ressload_key(keycode); break;
   }
  }
 
/////////////////////////////////////////// 
/////  运行控制////////////////////
/////////////////////////////////////////
   public final boolean process(){
   int count = 0;
   long secon = 0;
   long timeold = 0;
   long timenow = 0;

   running = true;
   while (running && !exitapp) {
    if(exitapp) return true;
    timenow = System.currentTimeMillis();
    if (timenow >= interval + timeold) {//FPS控制参见文章 如何控制游戏中的FPS

   http://www.j2medev.com/code/j2me/gui/200611/3802.html
     timeold = timenow;
     framenum = (framenum < 9999)? framenum +1 : 0;

   process_tick();//转入分支运行控制


     //计算当前的刷新帧数
     if(secon < (timenow / 1000)){
      secon = timenow/1000;
      framesec = count;
      count = 1;
     }else
      count ++;
    }
   }
   return exitapp;
  }
 
  public final void process_tick() {
   if(process_lock) return;
   switch(screen_index){
    case SCREEN_GAMEBODY: gamebody_run(); break;
    case SCREEN_MAINMENU: mainmenu_run(); break;
    case SCREEN_HELPINFO: helpinfo_run(); break;
    case SCREEN_COPYRIGH: copyrigh_run(); break;
    case SCREEN_GAMEOVER: gameover_run(); break;
    case SCREEN_HIGHLIST: highlist_run(); break;
    case SCREEN_RESSLOAD: ressload_exec(); break;
    case SCREEN_SELEGATE: selegate_run(); break;
   }
  }
 
 
  ////////////////////////////////
  ///////各部分方法/////////
  ///////////////////////////////
 
  游戏分为GAMEBODY//游戏主体
      MAINMENU//主菜单
      HELPINFO//帮助信息
      COPYRIGH//版权所有
      HIGHLIST//高分显示
      RESSLOAD//载入画面
      SELEGATE//关卡选择
  7个部分    


  每个部分都有5个方法
  以mainmenu为例写出
 
  //初使化
  private final void mainmenu_init(){初使化mainmenu_index
   mainmenu_index = 0;
  }
  ////响应按键
  private final void mainmenu_key(int keycode){/*里面内容省略*/
  case KEY_SOFT1:
     mainmenu_execute(mainmenu_index);//转入按键执行
     break;
  }
  //按键执行
  private final void mainmenu_execute(int index){
           /*按键响应相应命令  */  }
  //命令描绘
  private final void mainmenu_run(){
  refresh();
  //描绘部分
  private final void mainmenu_draw(){}
  }
 
 
  总结来看这个游戏的框架是
 
       主结构
      
  构造函数(声音载入图片载入)
  PAINT  (描绘-->分支描绘)
  RUN    (运行-->分支运行)
  KEY  (按键响应-->分支按键)
 
       分支结构
 
  init()
  key(int keycode)
  execute(int index)//转入命令执行(注 不是所有的都需要此执行可以把这个命令归  进key执行)
  run() //运行(描绘)
  draw()
 
 
  这个游戏很清晰的显示游戏运行思路将大框架再小框架,便于修改和查找;
  这里所给出的只是游戏框架部分,具体的AI和游戏主体框架出于篇幅没有给出,希望这篇文章能对新手有一定帮助!

(出处:http://www.cncms.com)


Tags:游戏 框架 心得体会

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接