游戲策劃咨訊
          做一個游戲并不難,難的是做一個好游戲;完美在于積累!
                  游戲引擎的結構很多,不過基本上都是在一個游戲主循環(huán)內實現。程序里面的主循環(huán)包含了程序框架的最主要的結構體。J2me的程序一般都包含兩個class文件,一個是MIDlet,一個是Displayable。一般我都是把游戲的主要代碼放在Displayable這個類里面。這個類是基于事件驅動的程序,有三個主要相應函數void paint(Graphics g),void keyPressed(int keyCode),void keyReleased(int keyCode)。

           

          1.         使用Runnable和創(chuàng)建線程的主循環(huán)

          一般主體的做法就是讓Displayable這個類實現Runnable這個接口,然后在其構造函數中創(chuàng)建一個線程,啟動其run()函數,run函數里面就包含了游戲的主循環(huán)。下面是我在仙劍里面的片斷代碼。

           

          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);

              }

           

           }

           

          其中關于控制主循環(huán)速度的代碼可以不要,但是lib.sleep(30)必須保留,因為在Nokia 60的手機上,如果去除了sleep(30),那么游戲將無法切換回來。同時,在游戲中任何一個內部循環(huán)中,也必須加入sleep(30)這個等待,才能讓游戲可以切換回來,至于為什么這樣做,我暫時還不清楚。30ms是我測試過沒有問題的數值,可能比30ms還小的值也是沒有問題的。

           

          同時,在MOTO的手機上,必須將游戲的主循環(huán)放在一個線程中,游戲才能切換回來,不過可以不加上面說的sleep(30)延時。

           

          2.         不使用線程的主循環(huán)辦法

          這個辦法只能在Nokia的平臺上實現,而我只建議在Nokia 40的平臺上做,這樣不需要線程,道理上來說節(jié)約了一些內存,如果不是內存很緊張的機型,那么最好還是使用上一種辦法。

           

          游戲的主循環(huán)放在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 藍色雪焰 閱讀(276) 評論(0)  編輯  收藏 所屬分類: 編程技術
           
          主站蜘蛛池模板: 绥棱县| 栾城县| 大渡口区| 吴忠市| 登封市| 衡山县| 民县| 林甸县| 都安| 建始县| 西林县| 吴桥县| 新宁县| 巨鹿县| 古浪县| 三明市| 平昌县| 宁都县| 新宁县| 丘北县| 内丘县| 乐清市| 谷城县| 柘城县| 七台河市| 孙吴县| 宣城市| 富阳市| 泉州市| 乌兰浩特市| 柯坪县| 广河县| 高雄县| 鲁甸县| 分宜县| 宁海县| 民权县| 神木县| 金坛市| 犍为县| 鹰潭市|