<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    游戲策劃咨訊
    做一個游戲并不難,難的是做一個好游戲;完美在于積累!
            游戲引擎的結構很多,不過基本上都是在一個游戲主循環內實現。程序里面的主循環包含了程序框架的最主要的結構體。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的平臺上做,這樣不需要線程,道理上來說節約了一些內存,如果不是內存很緊張的機型,那么最好還是使用上一種辦法。

     

    游戲的主循環放在MIDletclass里面,具體做法如下:

    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;

      }

     

    }

    posted on 2005-02-13 11:47 藍色雪焰 閱讀(274) 評論(0)  編輯  收藏 所屬分類: 編程技術
     
    主站蜘蛛池模板: 成人免费看片又大又黄| 三年片在线观看免费西瓜视频| 久久国产乱子伦精品免费一| 亚洲人成网77777色在线播放| 亚洲 无码 在线 专区| 久久精品国产亚洲AV麻豆~| 亚洲国产日韩视频观看| 最近最新MV在线观看免费高清| 亚洲女同成人AⅤ人片在线观看| 久久亚洲AV成人无码电影| 国产永久免费高清在线| 日本红怡院亚洲红怡院最新| 99免费在线视频| 亚洲AV成人片色在线观看| 亚洲AV女人18毛片水真多| 国产免费黄色大片| 亚洲爱情岛论坛永久| 日韩免费高清大片在线| 日韩精品免费在线视频| 亚洲av福利无码无一区二区| 99热这里只有精品免费播放| 亚洲国语在线视频手机在线| 精品香蕉在线观看免费| 亚洲AV无码乱码在线观看富二代| 色欲色香天天天综合网站免费| 亚洲色婷婷综合开心网| 亚洲jizzjizz少妇| 亚洲伊人成无码综合网 | 亚洲欧洲日产专区| 女人让男人免费桶爽30分钟| 日韩大片在线永久免费观看网站| 免费国产成人高清在线观看网站| 亚洲中文无码mv| 动漫黄网站免费永久在线观看| 亚洲av日韩专区在线观看| 337p日本欧洲亚洲大胆裸体艺术| 人妻无码一区二区三区免费| 亚洲精品人成网线在线播放va| 在线观看亚洲成人| 国产成人免费在线| 亚洲高清在线观看|