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

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

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

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

因為手機(jī)內(nèi)存和功能的限制,J2ME只提供了部分的J2SE工具類供使用者調(diào)用。所以有時我們不得不編寫自己的工具類來實現(xiàn)一些特殊的功能。下面給出的kSet類就類似于J2SE中Set工具類的功能...

編寫自己的工具類

  因為手機(jī)內(nèi)存和功能的限制,J2ME只提供了部分的J2SE工具類供使用者調(diào)用。所以有時我們不得不編寫自己的工具類來實現(xiàn)一些特殊的功能。下面給出的kSet類就類似于J2SE中Set工具類的功能。它用來記錄游戲中被刪去的方塊集合,同時保證集合中沒有相同元素。

  /***

  Description: Set類在J2ME上的實現(xiàn)

  *Date:2003.2.28*Author:Tomjava

  *email:tomjava@sohu.com

  */

  public class kSet

  {//用單鏈表實現(xiàn)PRivate kSetNode head;public kSet(){head=null;}

  //將kSet清空

  public void clear(){head=null;}

  //向kSet中添加元素

  public boolean add(int x,int y)

  {kSetNode node=new kSetNode(x,y);return add(node);}

  //向kSet中添加元素

  public boolean add(kSetNode node)

  { if(!contains(node))

  { node.next=head;head=node;return true;}

  else{return false;}}

  //判斷kSet是否為空

  public boolean isEmpty()

  {if(head==null)return true;elsereturn false;}

  //摘下鏈表頭元素并返回此元素

  public kSetNode getFirst()

  { kSetNode p=head;head=p.next;return p;}

  //遍歷kSet,如果有相同元素返回true,否則返回

  false

   public boolean contains(kSetNode node)

  {kSetNode p = head;while (p != null)

   {if(p.equals(node))return true;p=p.next;

   }return false;}

   }

  //kSet中的元素

  public class kSetNode

  { public int x,y;public kSetNode next;

  public kSetNode(int x,int y)

  {this.x=x;this.y=y;next=null;}

  public boolean equals(kSetNode node)

  {if(node.x==x&&node.y==y)

  return true;elsereturn false;

  }

  public int getX(){return x;

  }

  public int getY(){return y;}

  kSetNode類負(fù)責(zé)記錄被刪除方塊的坐標(biāo),它重載equals()方法用來判斷兩個方塊是否是同一個方塊。kSet類是由kSetNode對象組成的沒有相同元素的集合,用單鏈表實現(xiàn),并且提供了 getFirst()、add()、clear()、isEmpty()、contains()等方法供其它類調(diào)用。編寫和使用一些這樣的工具類,將大大加快編程的速度,也使程序變得更加清晰。 矯正屏幕坐標(biāo)

  GridOne這個游戲是專門為MotoT720開發(fā)的,也就是說游戲背景圖片大小和MotoT720型手機(jī)的大小是相等的。如果它在那些屏幕比MotoT720大的手機(jī)上運行,游戲背景圖片會顯示在屏幕左上角而影響美觀,這時就要用到屏幕矯正技術(shù),使得游戲背景圖片居中顯示。矯正屏幕坐標(biāo)代碼如下:

  public class BlocksCanvas extends Canvas implements Runnable{

  private final int addX;//坐標(biāo)矯正

  private final int addY;

  private final int SCREEN_X;//屏幕頂點

  private final int SCREEN_Y;

  private final int WAITBLOCK_X;//等待方塊頂點

  private final int WAITBLOCK_Y;

  private final int SCORES_X;//分?jǐn)?shù)頂點

  private final int SCORES_Y;

  private final int STAR_X;//五角星的頂點

  private final int STAR_Y;

  public BlocksCanvas()

  {//取得當(dāng)前手機(jī)屏幕的高度和寬度

  height = getHeight();

  width = getWidth();//坐標(biāo)矯正量

  addX = (width-120)/2;

  addY = (height-142)/2;//初始化屏幕參數(shù)

  SCREEN_X = addX + 48;//屏幕頂點

  SCREEN_Y = addY + 10;

  WAITBLOCK_X = addX + 19;//等待方塊頂點

  WAITBLOCK_Y = addY + 103;

  SCORES_X = addX + 36;//分?jǐn)?shù)頂點

  SCORES_Y = addY + 34;

  STAR_X=addX+4;//五角星的頂點

  STAR_Y=addY+70;

  }

  } 首先把所有有關(guān)屏幕的參數(shù)都定義成private final int型變量。這里之所以加上final 修飾符,是因為不希望變量附初值后,它們的值會發(fā)生變化;之所以不加static修飾符,是因為要在其函數(shù)中初始化變量,而不是在定義時就初始化好了。先用getHeight()和getWidth()函數(shù)取得當(dāng)前手機(jī)屏幕的高度和寬度,再計算出需要的偏移量addX和addY,然后加到各屏幕參數(shù)上,這樣游戲內(nèi)容就會居中顯示了。圖2與圖3是效果比較圖。

  

J2ME游戲開發(fā)技巧(2)(圖一)




  圖2 :矯正前

  

J2ME游戲開發(fā)技巧(2)(圖二)



  圖3 :矯正后

  還有一點需要注意,用getHeight()取得的并不是手機(jī)屏幕的真實高度,而是手機(jī)屏幕的高度減去Command標(biāo)簽高度,因為屏幕需要留出地方顯示Command標(biāo)簽。

  合理使用內(nèi)存

  本來使用Java編程是不需要關(guān)心內(nèi)存使用的,因為Java有它引以為豪的垃圾處理機(jī)制。但到了J2ME里,情況發(fā)生了變化,因為手機(jī)的內(nèi)存只有屈指可數(shù)的幾百K,再也不能像在J2SE里那樣大手大腳了。否則就會發(fā)現(xiàn),即使程序沒有任何語法和邏輯錯誤,也不能在模擬器中運行。下面給出合理使用內(nèi)存的幾個建議:

  1.盡可能使用本地變量代替類成員,減少對象的創(chuàng)建,最好能重新利用對象;

  2.不要試圖在初始化的時候把所有Form或者Canvas對象都讀入內(nèi)存中,而應(yīng)該在需要的時候再創(chuàng)建,雖然這樣在顯示上會有一些延遲,但是總比程序不能運行或者內(nèi)存溢出要好;

  3.一旦對象不需要使用就及時將其置為null,以便能夠被垃圾處理器回收,適當(dāng)?shù)臅r候調(diào)用System.gc()語句提示虛擬機(jī)調(diào)用垃圾處理器;

  4.必須記住Java的內(nèi)存管理是有向邊機(jī)制,所以對于不使用的對象,千萬不要讓正在使用的對象指向它,以免內(nèi)存得不到回收;

  5.盡量使圖片占有的字節(jié)數(shù)小一點,可以使用fireworks在保證圖片質(zhì)量同時減小圖片的大小;

  即使做到上面幾點,也不能保證程序不會發(fā)生內(nèi)存泄漏,因為手機(jī)內(nèi)存畢竟那么少。所以我提出最后一個建議,就是先完成游戲的主體部分,使它能夠正常運行并沒有內(nèi)存泄漏,再慢慢擴(kuò)展游戲,給它加上封面和其它功能。一旦發(fā)現(xiàn)內(nèi)存不足,再去掉部分功能。

  使游戲更有魅力

  編寫游戲當(dāng)然希望它能吸引人,我覺得下面幾個地方值得大家注意:

  1.注意控制游戲的節(jié)奏

  原來我在削除方塊的時候,什么都不做就直接刪除,然后開始一個新的循環(huán),讓等待的方塊往下掉。在實際運行的時候感覺效果不是很好,因為削得越快,上面的方塊也掉得越快,讓游戲者有一種措手不及的感覺。后來我在刪除方塊的時候,用空循環(huán)停頓了幾秒鐘,這樣就給了游戲者一個反應(yīng)時間,感覺就好些了,而且如果連削的話,反應(yīng)時間會更長,這樣使得游戲者在玩游戲時有一種輕松的感覺。再后來,我將空循環(huán)改成對屏幕上的方塊遍歷三次,讓被刪的方塊閃爍,使得游戲者能夠看清楚被刪除的方塊,欣賞到自己的成果,這樣又增加了游戲的吸引力。

  2.利用圖片實現(xiàn)豐富多彩的表達(dá)效果

  在J2ME中如果不能控制文字的大小和字體,那么這將使游戲的效果大打折扣。不過,可以通過把各種特殊的文字做成圖片的方法來解決這個問題。有些地方我們也可以用圖片來取代文字,使得游戲更加生動,比如在等級欄用五角星來表示游戲的難度。使用圖片還有一個好處就是增加游戲的通用性,使得游戲在不同手機(jī)上的顯示基本相同。另外,如果出現(xiàn)字體顏色在模擬器中顯示正常,而在手機(jī)上顯示不正常的情況,也可以用這種方式解決。

  3.讓游戲能夠自動調(diào)整難度

  我使用如下函數(shù),使得游戲難度不斷加大。

  private void giveLevel()

  {if(level<=10)

  { levelSleep=600-(level - 1) * 50;

  if(levelSleep<200)levelSleep=200;

  levelDelTask=200+(level-1)*100;

  if(levelDelTask>1000)levelDelTask=1000;//畫等級--五角星

  paintStar();

  }

  else{gameWin();}

  }

  level表示游戲等級,levelSleep表示方塊下落一個的等待時間,levelDelTask表示過一關(guān)需要刪除的方塊數(shù),也可以理解為過一關(guān)需要完成的任務(wù)。上面的計算公式可以保證游戲會越來越難,增加了游戲的吸引力

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



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南开区| 鄯善县| 淄博市| 岫岩| 明水县| 清苑县| 镶黄旗| 克拉玛依市| 都江堰市| 乌审旗| 泰顺县| 乌兰浩特市| 油尖旺区| 凤台县| 新建县| 旌德县| 合肥市| 铁力市| 宁乡县| 洛宁县| 宜城市| 红安县| 浮梁县| 若尔盖县| 太湖县| 喀什市| 太和县| 双牌县| 五华县| 永胜县| 奈曼旗| 平度市| 康马县| 仪征市| 泊头市| 和静县| 陈巴尔虎旗| 南郑县| 鸡西市| 宜川县| 陈巴尔虎旗|