首页 > 学院 > 开发设计 > 正文

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

2019-11-18 16:17:37
字体:
来源:转载
供稿:网友

                                                    游戏框架之心得体会(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.VeVb.com)



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表