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

J2ME下的游戲精靈的碰撞檢測

編輯:J2ME

碰撞檢測又稱為沖突檢測,是確定精靈之間是否相互沖突的一種方法。碰撞檢測用來確定精靈之間何時會發生物理的相互作用。例如,在游戲中,如果玩家精靈與小飛機精靈發生碰撞,玩家生命值將會降低。碰撞檢測就是用來檢測玩家與敵方(或子彈)是否發生碰撞的一種機制。在游戲設計中,有很多種方法可以處理碰撞檢測。最簡單的方法就是比較每個精靈的矩形邊界和其他精靈的矩形邊界是否交叉。這種方法效率很高,但是也有一種問題,比如並不是所有的精靈都是矩形的,當他們相互較近的錯過的時候,可能會引起一定程度的錯誤。可能因為邊角的重疊引起沖突,而實際上只是透明區域的重疊。精靈的形狀越不接近矩形,就會有越多的錯誤類型。可以想象矩形碰撞檢測是多麼的簡單而不夠精確,除非本來使用的精靈恰恰是矩形的。對這項技術的一個改進方法就是將沖突矩形縮小,從而減少錯誤。這種方法使情況略有改善,但是又有可能引發其他可能的潛在錯誤,就是允許精靈在某些情況下出現重合而不發出沖突信號。縮小後的矩形碰撞和簡單矩形碰撞一樣有效,因為所做的只是比較矩形是否相交。目前最有效的碰撞檢測就是根據精靈圖像數據來檢測碰撞(即像素檢測方法),這種方法實際上不是察看精靈的透明區域是否重合而是精靈圖像本身是否重合。在這種情況下,只有當精靈圖像重合時,才會獲得一個碰撞沖突。這種是理想的碰撞檢測技術,因為其十分的精確,並且對於任何形狀的對象的相互移動都不會發生錯誤。

 

模擬矩形碰撞檢測示意圖

如果沒有碰撞檢測算法,在本游戲運行過程中,就會出現一種可怕的局面,雖然可以實現背景的移動,以及玩家飛機行駛的效果,而且玩家也可以控制機體的前進方向,但卻會存在一個致使的缺陷——當敵方飛機被我方飛機擊中時,沒有任何響應,敵方飛機依舊行駛,分值沒有任何增加,好像什麼都沒有發生一樣。這都是因為沒有為游戲添加碰撞檢測的代碼所致。碰撞檢測是游戲中經常使用的一種重要算法。由於檢測游戲中的兩物體是否發生表面接觸。例如子彈是否命中敵機,敵機與玩家飛機是否相撞等。只有進行了碰撞檢測才有可能在出現上述情況後將敵機擊中,並且分值有所增加等效果。

使用MIDP API來碰撞沖突,可以使用Sprite類中的一系列方法,所有這些方法都叫做collidesWith()。collidesWith()方法包括三種,第一個collidesWith()方法檢測的是兩個精靈之間的碰撞:

collidesWith(Sprite s,Boolean pixelLevel);

要檢測一個沖突,只要在精靈上調用這個方法,並傳入另一個精靈。第2個參數決定了沖突檢測是否按照“像素連著像素”的方法,這就相當於圖像數據檢測方法。如果只是希望使用簡單的矩形檢測法在兩個精靈之間進行檢測,則可以把false值傳遞給collidesWith()方法。

其余兩種方法分別使用一個圖像和一個平鋪的圖層來檢測一個精靈的沖突。在使用圖像的情況下,指定了圖像的XY位置,並且,碰撞檢測在圖像和精靈上執行。平鋪的圖層和精靈相似,但是它使用多個平鋪圖像來創建一個大的合成圖像,如使用一個平鋪圖層來創建一個圍牆式的迷宮,然後檢測它一個精靈的沖突,以確保精靈位於范圍之內。

實現碰撞檢測代碼如下:

/*判斷enemyShip是否被玩家子彈擊中*/
     for(int i=0;i<MAX_SHOT;i++)
     {
       for(int j=0;j<MAX_enemyShip;j++)
       {
         if((playerShot[i].isVisible()) &&
                   (playerShot[i].collidesWith(enemyShip[j],true)))
         {

……//碰撞處理
}
}
}
…………
//查看玩家是否與小飛機相撞
                         for(int i=0;i<this.MAX_SP;i++)
                           if(smallPlane[i].isVisible() &&
                               smallPlane[i].collidesWith(playerSprite,true))
                           {

…………
                         }

出處:http://gaochaoJS.blog.51cto.com/812546/187185

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