碰撞類檢測技術(shù)
游戲中,碰撞是遇到最頻繁的技術(shù)。當(dāng)然,很多游戲引擎內(nèi)部已經(jīng)做了碰撞檢測處理,我們只需調(diào)用即可。本節(jié)課是從碰撞的原理進行講解,大家自己去實現(xiàn)基本的碰撞檢測。
矩形檢測原理
游戲中,多個元素是否碰到一起,實際上,通常是用“矩形檢測”原理實現(xiàn)的。 我們在前面提到,游戲中所有的物體都可以抽象成“矩形”,我們只需判斷兩個矩形是否相交即可。對于一些復(fù)雜的多邊形、不規(guī)則物體,實際上是將他分解成多個矩形,繼續(xù)進行矩形檢測。
Java的API中,為我們提供了Rectangle類來表示矩形相關(guān)信息,并且提供了intersects()方法,直接判斷矩形是否相交。
我們在前面設(shè)計GameObject這個基類的時候,增加過一個方法:
/**
*返回物體對應(yīng)矩形區(qū)域,便于后續(xù)在碰撞檢測中使用
*@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類:根據(jù)飛機狀態(tài)判斷飛機是否消失
publicvoiddrawMySelf(Graphics g) {
if(live){
super.drawMySelf(g);
//根據(jù)方向,計算飛機新的坐標
if(left){
x-=speed;
}
if(right){
x+=speed;
}
if(up){
y-=speed;
}
if(down){
y+=speed;
}
}
}
這樣,運行程序時,發(fā)生炮彈和飛機的碰撞,飛機消失,結(jié)果如圖1所示:
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師、高級工程師、架構(gòu)師。精通Java平臺軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop