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

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

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

    冰浪

    哥已不再年輕 - 堅定夢想,畢生追求!
    posts - 85, comments - 90, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    j2me游戲引擎程序結構

    Posted on 2009-04-09 09:15 冰浪 閱讀(128) 評論(0)  編輯  收藏 所屬分類: 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的平臺上做,這樣不需要線程,道理上來說節約了一些內存,如果不是內存很緊張的機型,那么最好還是使用上一種辦法。

     

    游戲的主循環放在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;

     }

     

    }

    主站蜘蛛池模板: 国产免费av片在线看| 在线观看H网址免费入口| 亚洲成年看片在线观看| AV激情亚洲男人的天堂国语| 100000免费啪啪18免进| 亚洲一区免费视频| 青青青国产在线观看免费| 亚洲最大黄色网址| 免费a级毛片无码a∨蜜芽试看| 亚洲国产中文在线视频| 亚洲精品动漫免费二区| 亚洲一区免费视频| 日本成人在线免费观看| 麻豆亚洲AV成人无码久久精品| 国产又大又长又粗又硬的免费视频| 久久亚洲色WWW成人欧美| 国产一精品一aⅴ一免费| 一道本不卡免费视频| 亚洲日韩小电影在线观看| 日韩电影免费观看| 亚洲国产精品美女| 免费看的黄色大片| 免费国产黄网站在线看| 国产亚洲情侣一区二区无码AV| 久久福利青草精品资源站免费| 99人中文字幕亚洲区| 性盈盈影院免费视频观看在线一区| 亚洲AV无码片一区二区三区 | 欧洲精品成人免费视频在线观看 | 亚洲精品在线播放| 成人五级毛片免费播放| 免费国产高清毛不卡片基地| 日本亚洲成高清一区二区三区| 亚洲网站免费观看| 黄网站色视频免费观看45分钟| 亚洲人成色77777| 国产大片线上免费观看| 一级做a爰片性色毛片免费网站| 亚洲AV无码乱码国产麻豆| 国产精品美女午夜爽爽爽免费| 美景之屋4在线未删减免费 |