原文見:http://today.java.net/pub/a/today/2005/07/07/j2me3.html?page=2

          構(gòu)建一個(gè)J2ME游戲:從GameCanvas類開始

          GameCanvas類繼承自Canvas,提供了一個(gè)屏幕后端的緩沖區(qū),所有的繪制操作都先在這個(gè)緩沖區(qū)里進(jìn)行。當(dāng)所有繪制操作完成后,我們調(diào)用flushGraphics()方法將緩沖區(qū)內(nèi)容輸出到屏幕。這種雙緩沖機(jī)制可以使圖像的移動(dòng)更加平滑,避免圖像的閃爍。緩沖區(qū)大小等于屏幕的大小,而且每一個(gè)GameCanvas實(shí)例有且僅有一個(gè)緩沖區(qū)。

          GameCanvas類提供一種存儲(chǔ)按鍵狀態(tài)的機(jī)制,我們可以通過(guò)它方便的了解用戶與游戲的交互。這種機(jī)制可以跟蹤用戶按特殊鍵的次數(shù),調(diào)用getKeyStates()方法返回所有游戲鍵按鍵狀態(tài)的二進(jìn)制表示,1代表上次調(diào)用方法后按過(guò)該鍵,0表示上次調(diào)用后還沒(méi)有按過(guò)該鍵。我們可以跟蹤的游戲狀態(tài)有(這里的鍵都是在Canvas類里定義的):DOWN_PRESSED, UP_PRESSED, RIGHT_PRESSED, LEFT_PRESSED, FIRE_PRESSED, GAME_A_PRESSED, GAME_B_PRESSED, GAME_C_PRESSED和GAME_D_PRESSED。

          首先擴(kuò)展GameCanvas類,定制一個(gè)游戲畫布,代碼見清單1。清單2是運(yùn)行例子的MIDlet。

          package com.j2me.part3;

          import javax.microedition.lcdui.Image;
          import javax.microedition.lcdui.Display;
          import javax.microedition.lcdui.Graphics;
          import javax.microedition.lcdui.game.GameCanvas;

          import java.io.IOException;

          public class MyGameCanvas
              
          extends GameCanvas
              
          implements Runnable
          {
              
          public MyGameCanvas()
              
          {
                  
          super(true);
              }

              
              
          public void start()
              
          {
                  
          try
                  
          {
                      
          //導(dǎo)入couple圖片,坐標(biāo)定位在屏幕中央
                      coupleImg = Image.createImage("/couple.gif");
                      coupleX 
          = CENTER_X;
                      coupleY 
          = CENTER_Y;
                  }

                  
          catch(IOException ioex)
                  
          {
                      System.err.println(ioex);
                  }

                  
                  Thread runner 
          = new Thread(this);
                  runner.start();
              }

              
              
          public void run()
              
          {
                  
          //獲取畫布的graphics對(duì)象
                  Graphics g = getGraphics();
                  
                  
          while(true//無(wú)窮循環(huán)
                  {
                      
          //基于上一個(gè)代碼清單列出的結(jié)構(gòu)
                      
                      
          //首先檢查游戲狀態(tài)
                      verifyGameState();
                      
                      
          //檢查用戶輸入
                      checkUserInput();
                      
                      
          //更新屏幕
                      updateGameScreen(getGraphics());
                      
                      
          //休息一下,控制刷新頻率
                      try
                      
          {
                          Thread.currentThread().sleep(
          30);
                      }

                      
          catch(Exception e)
                      
          {}
                  }

              }

              
              
          private void verifyGameState()
              
          {
                  
          //現(xiàn)在先不做任何操作
              }

              
              
          private void checkUserInput()
              
          {
                  
          //獲取按鍵信息
                  int keyState = getKeyStates();
                  
                  
          //計(jì)算x軸位置
                  calculateCoupleX(keyState);
              }

              
              
          private void updateGameScreen(Graphics g)
              
          {
                  
          //清空屏幕背景
                  g.setColor(0xffffff);
                  g.fillRect(
          00, getWidth(), getHeight());
                  
                  
          //將couple圖片繪制到當(dāng)前坐標(biāo)位置
                  g.drawImage(
                      coupleImg, coupleX, coupleY, Graphics.HCENTER 
          |
                      Graphics.BOTTOM);
                  
                  flushGraphics();
              }

              
              
          private void calculateCoupleX(int keyState)
              
          {
                  
          //判斷移動(dòng)方向
                  if((keyState & LEFT_PRESSED) != 0)
                  
          {
                      coupleX 
          -= dx;
                  }

                  
          else if((keyState & RIGHT_PRESSED) != 0)
                  
          {
                      coupleX 
          += dx;
                  }

              }

              
              
          private Image coupleImg;
              
          private int coupleX;
              
          private int coupleY;
              
          private int dx = 1//移動(dòng)量
              
              
          //屏幕中心
              public final int CENTER_X = getWidth() / 2;
              
          public final int CENTER_Y = getHeight() / 2;
          }

          清單 1. MyGameCanvas:游戲畫布的第一個(gè)版本

          清單 2 是使用這個(gè)游戲畫布的MIDlet:

          package com.j2me.part3;

          import javax.microedition.lcdui.Display;
          import javax.microedition.midlet.MIDlet;

          public class GameMIDlet extends MIDlet
          {
              MyGameCanvas gCanvas;
              
              
          public GameMIDlet()
              
          {
                  gCanvas 
          = new MyGameCanvas();
              }

              
              
          public void startApp()
              
          {
                  Display d 
          = Display.getDisplay(this);
                  gCanvas.start();
                  
                  d.setCurrent(gCanvas);
              }

              
              
          public void pauseApp()
              
          {}
              
              
          public void destroyApp(boolean unconditional)
              
          {}
          }

          清單 2. 運(yùn)行游戲示例的MIDlet類

          使用Wireless工具建立一個(gè)工程,導(dǎo)入這兩個(gè)類,然后生成并運(yùn)行工程。確保你的工程目錄res中有這個(gè)圖片文件couple.gif,并保證名稱為couple.gif, 圖1是運(yùn)行結(jié)果。

          j2me3_figure1.gif
          圖1. 構(gòu)建一個(gè)游戲:使用GameCanvas類

          使用設(shè)備的方向鍵可以左右移動(dòng)屏幕中的小圖像,這是通過(guò)從checkUserInput()里取得按鍵狀態(tài),然后調(diào)用calculateCoupleX(),通過(guò)將按鍵狀態(tài)與GameCanvas里預(yù)定義的按鍵值進(jìn)行與操作(&),得到用戶當(dāng)前按的鍵,然后將實(shí)例變量更新,最終反映到設(shè)備屏幕上。

          圖像是在updateGameScreen()方法里被繪制到屏幕上的。這個(gè)方法使用傳入的Graphics對(duì)象進(jìn)行繪制,每一個(gè)GameCanvas只有一個(gè)Graphics對(duì)象。方法首先擦除上次繪制的圖像,然后基于當(dāng)前的coupleX值(還有一直不變的coupleY值)繪制couple.gif圖像,最后將緩沖區(qū)的數(shù)據(jù)輸出到屏幕。

          run()方法里的循環(huán)體遵循我們剛開始提出的游戲結(jié)構(gòu)。循環(huán)每30毫秒檢查一次用戶輸入并刷新屏幕。你可以試著將這個(gè)值改變一下,這會(huì)改變刷新的頻率。

          最后,注意MyGameCanvas的構(gòu)造器里調(diào)用了父類GameCanvas的構(gòu)造方法,傳入的參數(shù)為true,這表示從Canvas類繼承的按鍵事件機(jī)制被抑制了,因?yàn)槲覀兊拇a不需要這些通知機(jī)制。我們的游戲狀態(tài)用GameCanvas里自帶的按鍵信息(由getKeyStates()方法取得)來(lái)處理已經(jīng)足夠了。通過(guò)抑制“keyPressed”、“keyReleased”和“keyRepeated”等通知機(jī)制,可以提高游戲的性能。



          版權(quán)所有 羅明
          posted on 2005-12-08 18:01 羅明 閱讀(2605) 評(píng)論(3)  編輯  收藏 所屬分類: JavaJ2ME
          Comments
          • # 好好學(xué)習(xí)
            ken
            Posted @ 2005-12-09 10:55
            package com.j2me.part3;

            import javax.microedition.lcdui.Display;
            import javax.microedition.midlet.MIDlet;

            這個(gè)地方看不懂,清單1和清單2怎么兩個(gè)相同的包名在,不是引用么  回復(fù)  更多評(píng)論   
          • # re: J2ME Tutorial, Part 3: 探究MIDP 2.0的游戲API(二)
            Andy luo
            Posted @ 2005-12-09 11:28
            這兩個(gè)類是放在一起的(一個(gè)包中),只不過(guò)清單2是主類,包含了一個(gè)清單1的實(shí)例。項(xiàng)目運(yùn)行時(shí)執(zhí)行清單2的MIDlet,然后清單1執(zhí)行相應(yīng)的繪制操作。  回復(fù)  更多評(píng)論   
          • # Meta-Tegi
            Meta-Tegi
            Posted @ 2009-05-18 03:37
            Hello everyone. Eat a third and drink a third and leave the remaining third of your stomach empty. Then, when you get angry, there will be sufficient room for your rage.
            I am from Pakistan and too bad know English, tell me right I wrote the following sentence: "Seo best practices innovations from chicago based seo consultant and resolution media associate director of search engine optimization, bryson meunier.In addition to pure seo services and web marketing, I have a lot of experience."

            Best regards :), Patricia.  回復(fù)  更多評(píng)論   
           
          主站蜘蛛池模板: 桂阳县| 斗六市| 涞源县| 连南| 湾仔区| 洪江市| 深泽县| 永丰县| 阿克苏市| 通许县| 红原县| 仁布县| 大港区| 凤阳县| 句容市| 沾化县| 宣恩县| 巴东县| 梧州市| 鹿邑县| 长宁区| 灌云县| 嘉定区| 阿图什市| 石景山区| 基隆市| 汉川市| 乌拉特前旗| 客服| 大新县| 新营市| 龙游县| 奉节县| 怀柔区| 惠东县| 屯昌县| 洪雅县| 珲春市| 衡南县| 吉安市| 万安县|