程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME游戲開發技巧(1)

J2ME游戲開發技巧(1)

編輯:J2ME
不久前我曾用J2ME開發了一個MotoT720下的彩色游戲—寶石方塊(GridOne)。開發過程中積累了一些經驗,現在寫出來與大家分享。

  使用雙緩沖避免屏幕閃爍

  雙緩沖技術是編寫J2ME游戲程序的關鍵技術之一。實際上,雙緩沖技術是計算機動畫的一項傳統技術。造成屏幕閃爍的主要原因在於,畫面在顯示的同時,程序又在改變它,於是畫面閃爍。解決辦法就是在內存中開辟一片區域作為後台畫面,程序對它更新,修改,完成後再顯示它。這樣被顯示的圖像永遠是已經完全畫好的圖像,程序修改的將不是正在被顯示的圖像。當然還有其它方法可以解決屏幕閃爍問題,但使用雙緩沖技術是一種值得推薦的解決方案。具體方法可參見如下代碼:

  public class BlocksCanvas extends Canvas implements Runnable

  {

  Graphics bg;Image buf;public BlocksCanvas()

  {height = getHeight();

  width = getWidth();

  //按屏幕大小建立緩沖對象

  buf = Image.createImage(width, height);

  //將緩沖對象的Graphics附給bgbg = buf.getGraphics();

  ......}

   public void run()

  {

  ......for(i=0;i{for(j=0;

  j

  {//畫方塊drawBlock(x,y);}}

  repaint();}private void drawBlock(int block_x, int block_y)

  {

  //取得方塊的坐標

  int x = getLeft(block_x);int y = getTop(block_y);

  //取得方塊的顏色

  int c= board[block_x][block_y];

   bg.drawImage(imgs[c], x, y, Graphics.TOP   Graphics.LEFT);

  }

  public void paint(Graphics g)

  {

  g.drawImage(buf, 0, 0, Graphics.TOP   Graphics.LEFT);

  }}

  由上面代碼可見,雙緩沖思想體現在程序上就是要依次完成以下幾步工作:

  1.定義一個Graphics對象bg和一個Image對象buf,按屏幕大小建立一個緩沖對象附給buf,然後取得buf的Graphics對象附給bg。在這裡,Graphics對象可以理解為緩沖的屏幕,Image對象則可當成緩沖屏幕上的圖片。

  2.在bg(緩沖屏幕)上用drawImage()和drawString等語句畫圖,相當於在緩沖屏幕上畫圖。

  3.調用repaint()語句,它的功能是告知系統調用paint()來完成真實屏幕的顯示。這裡需要注意的是,paint()是一個系統調用語句,不能手工調用,只能通過paint()語句來調用。

  4.在paint(Graphics g)函數裡,將buf(緩沖屏幕上的圖片)畫到真實屏幕上。

  以上的步驟雖然看似繁瑣,但是效果還是很不錯的。如果想要在屏幕上顯示什麼東西,只管畫在bg上,然後調用repaint()將其顯示出來就可以了。
  編寫自己的斷點函數

  



  圖1:斷點測試

  在開發J2ME程序過程中,最困擾人的問題就是程序容易莫名其妙地死機。當使用JBuilder或者CodeWarrior設置斷點功能來查找程序錯誤時,死機的概率就更大了。即使不死機,也會擔心程序受到了意外的干擾,所以一般不推薦使用開發工具自帶的斷點功能。但有時候又需要一個功能來顯示當前各變量的值,以便查錯時做出正確的判斷。於是我想了一個辦法,就是編寫自己的斷點函數。具體代碼如下:

  public class BlocksCanvas extends Canvas implements Runnable{

  private boolean stopFlag=false;

  //調試標志......public void run()

  {//斷點位置1testFun(“x:”+x+“y:”+y);

  ......//斷點位置2testFun(“”);......

  }private void testFun(String str)

  {

  stopFlag=true;//畫一個白色長方形

  bg.setGrayScale(255);

  bg.fillRect(0,0, fontW, fontH);//在白色長方形上顯示str的內容

  bg.setGrayScale(0);

  bg.drawString(str, 0,0, Graphics.TOP   Graphics.LEFT);

  repaint();

  while(stopFlag)

  {}}

  public void keyPressed(int keyCode)

  { stopFlag=false;} }

  首先定義一個boolean類型的stopFlag變量來記錄調試標志。一開始它的值為false,進入testFun()函數後,值設為true。顯示完str的內容後,因為stopFlag的值為true,所以while語句進入了死循環,程序停了下來。這時可以仔細地看清楚變量的值。然後當按下任意鍵時,keyPressed()函數捕捉到這一事件,將stopFlag設為false,死循環自動解開。使用此方法非常方便,只要在需要斷點的地方放置testFun()語句即可,一個程序可以放置多個testFun()語句,在循環語句中也可以放置testFun()語句。程序運行到testFun()語句會自動停下顯示變量值,按任意鍵程序又會自動運行,程序也不會受到意外的干擾。圖1是調試時的截圖。

  還有一點需要說明,此方法的testFun()語句必須放在run()函數中或者run()函數運行時調用的函數中,否則就會因為while()占用了所有CPU時間而導致keyPressed()函數無法捕捉按鍵事件,最後導致死機。

  此方法只要稍加修改,就可以用做游戲的暫停功能,而且比sleep()方法好,畢竟理論上sleep()方法不能無限期暫停下去。下面給出相應的代碼:

  public class BlocksCanvas extends Canvas implements Runnable

  {private boolean stopFlag=false;//暫停標志

  ......public void run

()

  {......testFun();......}

  private void testFun()

  { while(stopFlag){}}public void keyPressed(int keyCode)

  {

   int action = getGameAction(keyCode);

  if(action== FIRE)stopFlag=!stopFlag;}

  }

  該程序段的功能為,當使用者按下FIRE鍵時,游戲暫停;再次按下FIRE鍵,游戲繼續運行。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved