国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

J2ME游戲開發(fā)技巧(1)

2019-11-18 16:20:07
字體:
供稿:網(wǎng)友

雙緩沖技術(shù)是編寫J2ME游戲程序的關(guān)鍵技術(shù)之一。實際上,雙緩沖技術(shù)是計算機動畫的一項傳統(tǒng)技術(shù)。造成屏幕閃爍的主要原因在于,畫面在顯示的同時,程序又在改變它...

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

  使用雙緩沖避免屏幕閃爍

  雙緩沖技術(shù)是編寫J2ME游戲程序的關(guān)鍵技術(shù)之一。實際上,雙緩沖技術(shù)是計算機動畫的一項傳統(tǒng)技術(shù)。造成屏幕閃爍的主要原因在于,畫面在顯示的同時,程序又在改變它,于是畫面閃爍。解決辦法就是在內(nèi)存中開辟一片區(qū)域作為后臺畫面,程序?qū)λ拢薷?,完成后再顯示它。這樣被顯示的圖像永遠(yuǎn)是已經(jīng)完全畫好的圖像,程序修改的將不是正在被顯示的圖像。當(dāng)然還有其它方法可以解決屏幕閃爍問題,但使用雙緩沖技術(shù)是一種值得推薦的解決方案。具體方法可參見如下代碼:

  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)

  {

  //取得方塊的坐標(biāo)

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

  }}

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

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

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

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

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

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

  

J2ME游戲開發(fā)技巧(1)



  圖1:斷點測試

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

  public class BlocksCanvas extends Canvas implements Runnable{

  private boolean stopFlag=false;

  //調(diào)試標(biāo)志......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的內(nèi)容

  bg.setGrayScale(0);

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

  repaint();

  while(stopFlag)

  {}}

  public void keyPressed(int keyCode)

  { stopFlag=false;} }

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

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

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

  public class BlocksCanvas extends Canvas implements Runnable

  {private boolean stopFlag=false;//暫停標(biāo)志

  ......public void run()

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

  private void testFun()

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

  {

   int action = getGameAction(keyCode);

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

  }

  該程序段的功能為,當(dāng)使用者按下FIRE鍵時,游戲暫停;再次按下FIRE鍵,游戲繼續(xù)運行

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐清市| 大邑县| 东丰县| 鹰潭市| 隆安县| 桃江县| 田东县| 沾化县| 禄丰县| 华阴市| 新巴尔虎左旗| 嘉义市| 乐东| 当雄县| 土默特右旗| 吐鲁番市| 贡嘎县| 准格尔旗| 锡林郭勒盟| 桦川县| 封开县| 晴隆县| 峨眉山市| 波密县| 巫溪县| 黄冈市| 古蔺县| 隆德县| 锦屏县| 邹城市| 娄烦县| 塘沽区| 房产| 习水县| 来宾市| 若尔盖县| 突泉县| 咸丰县| 昭觉县| 夏津县| 南江县|