<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)  編輯  收藏 所屬分類: 編程技術
     
    主站蜘蛛池模板: 最近国语视频在线观看免费播放| 亚洲国产中文在线二区三区免| 青青青视频免费观看| 国产猛烈高潮尖叫视频免费| 亚洲国产无线乱码在线观看 | 亚洲人成国产精品无码| 四虎影视永久在线精品免费| 一本久久综合亚洲鲁鲁五月天| 特色特黄a毛片高清免费观看| 久久久久亚洲AV成人网人人软件| 一级成人毛片免费观看| 国产亚洲精品va在线| 99热在线精品免费播放6| 亚洲电影在线播放| AV免费网址在线观看| 国产精品亚洲精品日韩电影| 美腿丝袜亚洲综合| 97在线视频免费播放| 亚洲偷自精品三十六区| 日韩免费三级电影| 国产在线观看无码免费视频| 婷婷精品国产亚洲AV麻豆不片| 最近高清中文字幕免费| 亚洲愉拍一区二区三区| 亚洲成年看片在线观看| 日韩人妻一区二区三区免费| 亚洲va在线va天堂va手机| 国产一级淫片视频免费看| 野花香高清视频在线观看免费| 亚洲精品自在线拍| www亚洲一级视频com| 日本一卡精品视频免费| 亚洲国产精品无码久久98| 亚洲高清专区日韩精品| 国产福利在线观看免费第一福利| 午夜亚洲乱码伦小说区69堂| 国产成人亚洲综合无码精品| 国产免费av片在线看| 在线观看免费无码视频| 7777久久亚洲中文字幕| 亚洲中文字幕在线观看|