2011-07-04 35 views
6

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif2D平臺變形器AABB碰撞問題

我有一個AABB衝突解決的問題。


我通過先解析X軸然後解析Y軸來解析AABB相交。 這樣做是爲了防止這種錯誤:當一個物體移動到玩家與玩家必須水平推http://i.stack.imgur.com/NLg4j.png


目前的方法,工作正常。正如您在.gif中看到的那樣,水平尖峯可以正確推動播放器。


但是,當垂直尖刺進入播放器時,X軸仍然會先解析出來。這使得「使用尖峯作爲電梯」是不可能的。

當玩家移動到垂直尖峯(受重力影響落入)時,他被推向Y軸,因爲X軸沒有重疊開始。


我試過的東西是在first answer of this link中描述的方法。 然而尖峯和移動物體的位置發生了變化,而不是速度,我不計算它們的下一個預測位置,直到它們的Update()方法被調用。 不用說這個解決方案也沒有效果。 :(


,我需要解決AABB碰撞中,兩個以上的工作描述的情況下按預期的方式

這是我目前衝突的源代碼。http://pastebin.com/MiCi3nA1

我會真的很感謝有人可以研究這個問題,因爲這個bug從一開始就一直存在於引擎中,我一直在努力尋找一個好的解決方案,但沒有取得任何成功。在碰撞代碼,並阻止我進入「有趣的部分」和編碼的遊戲邏輯:(


我試着實施與XNA AppHub平臺遊戲演示中相同的碰撞系統(通過複製粘貼大部分內容)。然而,「跳躍」錯誤發生在我的遊戲中,而它在AppHub演示中不會發生。 [跳躍bug:http://i.stack.imgur.com/NLg4j.png]

要跳轉我檢查玩家是否在「onGround」,然後加-5到Velocity.Y。

由於玩家的Velocity.X高於Velocity.Y(參考圖中的第四個面板),因此onGround在不應該時設置爲true,從而讓玩家在空中跳躍。

我相信這不會發生在AppHub演示中,因爲播放器的Velocity.X永遠不會比Velocity.Y更高,但我可能會誤解。

我之前解決了這個問題,先在X軸上解析,然後在Y軸上解析。但是,正如我上面所說的那樣,這會阻止與尖峯的碰撞。

+0

僅供參考這裏是gamedev.stackexchange.com上的相同問題 - 它有更多的答案:http://gamedev.stackexchange.com/questions/14486/2d-platformer-aabb-collision-problems?lq=1 – LearnCocos2D

回答

0

的一種可能的解決方案,我發現是基於玩家的速度解決之前排序的對象。

0

爲什麼不能在Y軸解決第一個垂直尖峯,並在X軸首先爲水平尖峯?順便說一下,好的圖形。


據我瞭解,你正在處理的移動和碰撞是這樣的:

  1. 移動的所有對象。
  2. 對於每個對象ø,測試玩家和ö之間的交叉,並在必要時,水平或垂直地噴射玩家,以便它不再與ö相交。
  3. 如果玩家仍與某個對象相交,然後(東西)

這意味着,當你來到步驟(2),你已經忘記了對象Ø在動哪一種方式,因此,如果它試圖向上或向側面推的球員,你不能告訴。

解決方案:在步驟(1)中,存儲爲每個對象被移動的方向。當你發現玩家與一個物體相交時,你可以看看物體是向上,向下,向左還是向右移動,這將告訴你執行彈射的方式。

+0

這就是「最後的手段」解決方案。我希望找到一種能夠在「自動」情況下適用於所有情況的通用解決方案。 –

+0

您是不是打算轉向「有趣的部分」? ;) 這個解決方案聽起來很合理,也許它是唯一/最好的解決方案。嘗試一下,然後移動一個,以後可以隨時回來。 – LearnCocos2D

+0

想一想,你需要處理移動「平臺」不同於靜態碰撞瓷磚。當玩家在移動平臺的頂部時,移動平臺意味着在評估碰撞之前將平臺移動的三角形位置添加到玩家位置的每一幀。這需要在玩家移動之前移動平臺。請參閱平臺部分:http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/ – LearnCocos2D

0

正如加雷思·雷斯已經說過,這個問題是檢測到衝突後,您需要了解更多信息(包括當前位置和任一方向從或最後位置來)進行碰撞響應。

如果兩個物體都在移動,它會變得非常複雜。相反,選擇一個物體作爲參照系,並從其他物體中減去它的速度。

甲直接的解決方案可能是用於非幀的參考物體的移動/△創建線段。然後將這些片段與4個AABB邊相交。這給出交叉點的時間和交點處的法線。然後,您可以應用您現在具有的相同回覆。