簡體   English   中英

碰撞反應2D

[英]Collision response 2d

問題: 問題http://img684.imageshack.us/img684/5486/prob1b.png 問題http://img810.imageshack.us/img810/3157/prob3.png 綠色方塊是播放器,灰色方塊是靜態的磚

當跳到瓷磚上時,如果玩家站在碰撞瓷磚的邊緣附近,則將其向左/向右推。 發生這種情況的原因可能是,向上的跳躍速度大於x方向的運動速度(甚至可能為0),因此玩家在x軸上得到了校正。

偽代碼如下所示:

  • 1:讓玩家周圍的瓷磚碰撞
  • 2:foreach碰撞圖塊:

{

  • 2a:獲取相交深度
  • 2b:用最小校正軸校正播放器位置(例如:if(Math.Abs​​(X)> Math.Abs​​(Y)然后校正Y值。否則校正X值)

//以下是一些其他偽代碼,這些偽代碼不應成為問題的一部分:

  • 2c:如果與玩家的上側碰撞:取消任何跳躍
  • 2d:如果與播放器底部發生碰撞:IsStandingOnGround = true;

}

一些代碼:

  foreach (Stone stone in collidingStones)
            {
                #region Collision Response
                if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
                {
  //warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
                    Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
                    if (Math.Abs(correction.X) > Math.Abs(correction.Y))
                    {
                        Location += new Vector2(correction.X, 0);
                    }
                    else
                    {
                        Location += new Vector2(0, correction.Y);
                    }

有趣的問題是,幾年前,我在Delphi開發游戲,但遇到了同樣的問題。 要點:

  • 碰撞時應同時校正X和Y。 高速(大於〜3px /更新)時,僅校正X或Y看起來不自然。
  • 您正在執行的碰撞​​檢測將適用於矩形填充的圖塊,但是如果您使用的是不規則的圖塊(例如斜面的三角形),則將無法計算碰撞的校正值。

最后,我制作了一個引擎,其中每個圖塊都有位圖 (實際的可見圖形),我稱之為freemap ,這是一個黑白位圖,表示圖塊中的可用空間圖。 然后,我編寫了碰撞函數,該函數首先在圖塊空間中運行(以確定與播放器碰撞的圖塊),然后在圖塊的位圖中運行。

移動播放器時,您需要根據播放器速度來計算下一個點,然后沿着當前位置和計算出的下一個位置之間的直線測試每個點。 如果您在那條線上遇到障礙,那么您將在該位置停止播放器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM