13.7-全棧Java筆記:打飛機游戲實戰項目|Rectangle|intersects|Plane

碰撞類檢測技術

游戲中,碰撞是遇到最頻繁的技術。當然,很多游戲引擎內部已經做了碰撞檢測處理,我們只需調用即可。本節課是從碰撞的原理進行講解,大家自己去實現基本的碰撞檢測。

矩形檢測原理

游戲中,多個元素是否碰到一起,實際上,通常是用“矩形檢測”原理實現的。 我們在前面提到,游戲中所有的物體都可以抽象成“矩形”,我們只需判斷兩個矩形是否相交即可。對于一些復雜的多邊形、不規則物體,實際上是將他分解成多個矩形,繼續進行矩形檢測。

Java的API中,為我們提供了Rectangle類來表示矩形相關信息,并且提供了intersects()方法,直接判斷矩形是否相交。

我們在前面設計GameObject這個基類的時候,增加過一個方法:

/**

*返回物體對應矩形區域,便于后續在碰撞檢測中使用

*@return

*/

publicRectangle getRect(){

returnnewRectangle((int)x,(int)y,width,height);

}

也就是說,本游戲中所有物體都能拿到他自己的矩形對象。

炮彈和飛機碰撞檢測

我們的游戲邏輯是:“飛機碰到炮彈,則死亡”。也就是說,我們需要檢測:“飛機和所有的炮彈是否碰撞”。如果有50個炮彈對象,則進行50次比對檢測即可。

我們修改MyGameFrame類的paint()方法,如示例1所示。

【示例1】MyGameFrame類:增加碰撞檢測

publicvoidpaint(Graphics g) {

g.drawImage(bgImg, 0, 0,null);

plane.drawMySelf(g);//畫出飛機本身

//畫出容器中所有的子彈

for(inti=0;i

Shell ? b =shellList.get(i);

b.draw(g);

//飛機和所有炮彈對象進行矩形檢測

booleanpeng = b.getRect().intersects(plane.getRect());

if(peng){

plane.live=false;//飛機死掉,畫面不顯示

}

}

上面邏輯要求:plane.live=false時,飛機消失。所以,我們也需要修改Plane的代碼。

【示例2】Plane類:根據飛機狀態判斷飛機是否消失

publicvoiddrawMySelf(Graphics g) {

if(live){

super.drawMySelf(g);

//根據方向,計算飛機新的坐標

if(left){

x-=speed;

}

if(right){

x+=speed;

}

if(up){

y-=speed;

}

if(down){

y+=speed;

}

}

}

這樣,運行程序時,發生炮彈和飛機的碰撞,飛機消失,結果如圖1所示:

1發生碰撞后的運行效果圖


「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。

筆記包含從淺入深的六大部分:

A-Java入門階段

B-數據庫從入門到精通

C-手刃移動前端和Web前端

D-J2EE從了解到實戰

E-Java高級框架精解

F-Linux和Hadoop

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容