2010-04-17 59 views
4

我正在用C++和SDL進行一個2D平臺遊戲/格鬥遊戲,我在碰撞檢測方面遇到了一些麻煩。兩個平臺的2D平臺碰撞問題

這些關卡由一系列瓷磚組成,我用一個for循環遍歷每一個(我知道這可能不是最好的方法,我也可能需要幫助)。對於角色的每一側,我將它移動一個像素在這個方向上,並檢查是否有碰撞(我也檢查角色是否朝着這個方向移動)。如果發生碰撞,我將速度設置爲0並將玩家移動到平鋪的邊緣。

我的問題是,如果我先檢查水平碰撞,並且玩家每幀以超過一個像素垂直移動,則它會處理水平碰撞並將角色移動到瓦片的一側,即使瓦片低於(或以上)角色。如果我首先處理垂直碰撞,它會做同樣的事情,除了橫軸。

如何處理兩軸碰撞而不會出現這些問題?有沒有更好的方法來處理碰撞,而不是我怎麼做?

+0

在移動角色之前或在移動然後檢查之後,您是否檢查碰撞? – 2010-04-17 02:47:20

+0

我在移動角色後檢查它。 – ausgat 2010-04-17 13:59:31

回答

3

XNA's 2D platformer example也使用基於瓦片的碰撞。他們處理的方式非常簡單,可能對您有用。這裏是一個什麼樣的在那裏一個精簡的解釋(除去具體到他們的-演示的東西):

  1. 應用運動後,它會檢查碰撞。
  2. 它根據玩家的邊框確定玩家重疊的圖塊。
  3. 它遍歷所有這些瓷磚...
    1. 如果被檢查的區域並不通行:
    2. 它確定多遠在X軸和Y軸玩家被重疊非可通過瓦片
    3. 碰撞僅在淺軸線解決
      1. 如果Y是淺軸(abs(overlap.y)< abs(overlap.x)),則position.y + = overlap.y;同樣如果X是淺軸。
      2. 邊界框更新基於位置改變到下一個瓦片
    4. 移動...

它在player.cs在HANDLECOLLISIONS()函數,如果你抓住代碼並想看看他們在那裏具體做了什麼。

+0

這可能有點奇怪,但淺的軸是什麼?我搜索了一下,找不到與之相關的任何內容。 – DMan 2010-12-11 05:13:09

+0

通過「淺軸」,我的意思是那個被碰撞較少穿透的軸。例如,如果角色的位置在Y軸上計算爲5個單位,在X軸上計算爲10個單位,則Y是淺軸。 – chaosTechnician 2010-12-14 19:05:53

0

是的。基於矢量的碰撞會比基於瓦片好得多。將tile的每個邊緣定義爲線條(有快捷方式,但現在忽略它們)。現在查看是否發生了碰撞,找到最接近的水平線和垂直線。如果您採用lastPos.x * LineVector.y - lastPos.y * LineVector.x的符號並將其與thisTurnsPos.x * LineVector.y - ThisTurnsPos.y * LinePos.x進行比較。如果這兩個值的符號不同,那麼您已經越過了這條線。這並不檢查你是否越過了線段的盡頭。你可以在同一個lineVector和你的curPosition之間形成一個點積(這裏有一點小錯誤,但可能足夠好),它可以是負值也可以大於線的幅值平方,你不在該線段內並且沒有發生碰撞。

現在這太複雜了,你可能會用一個簡單的網格檢查來看看你是否已經進入另一個廣場的區域。但!使用矢量做它的好處是它解決了比碰撞盒問題更大的速度(更重要的是),你可以使用非軸對齊的線來處理碰撞。這個系統適用於任何2D矢量(並且還有一點點按摩功能,3D功能)。它還允許您輕鬆地沿着碰撞盒的邊緣滑動角色,因爲您已經完成了99%的數學運算找到碰撞後你應該在哪裏。

我已經掩蓋了幾個實現細節,但我可以告訴我,我已經在無數商業視頻遊戲中使用了上述方法,並且它的工作就像一個魅力。祝你好運!

+0

我忘了提及我對遊戲開發相當陌生,而且我正在開發的遊戲非常簡單。基於矢量的碰撞檢測確實聽起來更好,但我認爲我還沒有做到。 – ausgat 2010-04-17 16:52:39