<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)  編輯  收藏 所屬分類: 編程技術
     
    主站蜘蛛池模板: 午夜免费啪视频在线观看 | 四虎在线免费播放| 亚洲日韩乱码中文无码蜜桃臀| 免费成人在线电影| 久久伊人久久亚洲综合| 国产精品免费一区二区三区四区| 中文字幕亚洲专区| 另类免费视频一区二区在线观看| 亚洲AV无码久久精品狠狠爱浪潮| 久久精品电影免费动漫| 亚洲视频精品在线观看| 国产h视频在线观看免费| 亚洲综合一区无码精品| 日日夜夜精品免费视频| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 国产日韩AV免费无码一区二区| 国产AV无码专区亚洲Av| 69视频在线是免费观看| 亚洲人xxx日本人18| 国产大片免费观看中文字幕| 免费无遮挡无遮羞在线看| 亚洲欧洲一区二区三区| 中文无码成人免费视频在线观看| 久久久无码精品亚洲日韩蜜臀浪潮| 成人免费大片免费观看网站| 亚洲AV无码之国产精品| 亚洲一区无码精品色| 午夜影院免费观看| 亚洲国产精品美女久久久久| 亚洲AⅤ无码一区二区三区在线| 成人妇女免费播放久久久| 噜噜噜亚洲色成人网站∨| 成年大片免费视频| 在线观看黄片免费入口不卡| 亚洲精品自在线拍| 成人亚洲网站www在线观看| 国产无遮挡裸体免费视频在线观看| 亚洲免费电影网站| 红杏亚洲影院一区二区三区| 日日麻批免费40分钟日本的| 无套内射无矿码免费看黄|