小遊戲開發 Mario (8) 碰撞

繼續上次的遊戲碰撞檢測的主題,上次我們通過方法 testCollision 來檢查兩個物體是否碰撞,如果發生碰撞就返回 true 否則返回 false。這種檢測可用於判斷角色與子彈或與怪物接觸時,但是如果一個運動的角色與牆壁呀或與者障礙物接觸時,角色是無法穿過障礙物,或停留在障礙物內部,角色會退回一個位置。角色碰撞後回到什麼位置是今天重點討論的內容。

這裏會用到數學中學到的向量概念,向量是有大小和方法。我們用一個向量表示運動角色與障礙物中心的連接線,有點不準確,爲了便於大家理解,暫時看作一條線段,如下圖(連接綠色和藍色小塊中心的連線)

紅色線段兩端分別是角色(綠色)和障礙物(藍色)的中心點。如果這條線端在座標的 x  軸和 y 軸上都會有投影。.

vector_x 和 vector_y 分別代表向量在 x 軸和 y 軸上的分向量。

現在注意一下,在下圖中,當綠色小塊從左側向藍色小塊方向運動,當碰撞時 vector_x 應該大於 vector_y。從其他三個方向向藍色小塊運動碰撞的場景,大家可以自己嘗試畫一下,推一下其中規律。

不難看出當 vector_x 大於 vector_y 說明綠色小塊是從重左右兩側來與藍色小塊進行碰撞。當 vector_y 大於 vector_x 說明綠色小塊是從重上下兩側來與藍色小塊進行碰撞。所以我們可以抽象出四個象限,通過綠色小塊運動方向和 vector_x 和 vector_y 關係可以劃分爲四個區域。

通過上面總結,我們可以很好理解下面的兩個圖,虛線小塊是藍色小塊碰撞時快照,綠色小塊表示碰撞後彈回的位置

上代碼

在 Rectangle 中創建 resolveCollision 方法如下圖,代碼中 vector_y 和 vectory_x 平方後進行比較,爲了比較其絕對值。當 vector_y 大於 vector_x 並說明是上下方向上進行的碰撞,vector_y > 0 表示從下方向上進行碰撞所以會停止在藍色小塊下方。其他三種情況可以自己看一看,就不一一說明了。

然後我們在 if(palyer.testCollision(tile)) 中調用 resolveCollision 方法,說明其前提條件是兩個小塊已經發生碰撞。

今天就到這裏,下週我們回到 mario 遊戲開發,將這些理論應用到開發中進行實踐。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章