簡體   English   中英

尋找一種處理基於平鋪的角碰撞的好方法

[英]Looking for a good way to handle tile based corner-collisions

好的,我有一個平鋪的地圖(很明顯),並且實現了一個碰撞檢測系統,該系統對我來說真的很好用。 但是在那些討厭的角落有麻煩。 我確實知道為什么會這樣,因為我什至不檢查角落。 這就是重點,我不知道該怎么做。 所以,首先這里是我當前的代碼:

        Body body = currentObject.Body; // Body is a class storing position, velocity, bounds and so on.

        int tileDimensions = level.TileWidth; // Since the tiles are squares...

        int leftTile = body.Bounds.Left / tileDimensions;
        int topTile = body.Bounds.Top / tileDimensions;
        int rightTile = (int)Math.Ceiling((float)body.Bounds.Right / tileDimensions - 1);
        int bottomTile = (int)Math.Ceiling(((float)body.Bounds.Bottom / tileDimensions) - 1);

        if (body.Velocity.Y > 0) // Moving down.
        {
            for (int x = leftTile; x <= rightTile; x++)
            {
                for (int y = bottomTile + 1; y <= (bottomTile + 1) + (body.Velocity.Y / tileDimensions); y++)
                {
                    if (tiles[x, y] != null && !tiles[x, y].IsPassable)
                    {
                        newVelocity = new Vector2(body.Velocity.X, MathHelper.Clamp(body.Velocity.Y, 0, tiles[x, y].Body.Bounds.Top - body.Bounds.Bottom));
                        body.Velocity = newVelocity;
                        break;
                    }
                }
            }
        }

因此,僅此而已。 上面,左邊和右邊還有其他3種構造。 唯一真正的區別是回路和鉗制速度的方式。

如您所見,我只是遍歷所有可能發生碰撞的圖塊。 然后我鉗住速度,以防萬一確實有瓷磚在移動。

現在,恐怕僅憑文字很難解釋我的問題,因此我也必須張貼一張圖片。

在此處輸入圖片說明

在此屏幕截圖中,黃色表示不可通過的圖塊,黑色是上述代碼當前正在檢查碰撞的圖塊,紅色是播放器。

為了向您展示問題所在,想象一下我將在此框架內加速前進。 如您所見,我的播放器右上角的瓷磚會發生碰撞,但是由於我不檢查它是否碰撞,所以玩家會進入瓷磚中。 而且我也不會在下一幀中檢查它,因為我不檢查我所在的塊,因為...我什至不知道,那會背叛我代碼的整個思想,不是嗎? :P

當然,我可以擴展“搜索”范圍,但隨后我將與圖塊發生沖突,而我不應該與之發生沖突。 目前,我正在對所有與邊界重疊的圖塊進行額外檢查,以解決此問題,並且...如果知道,只要將播放器移回去即可。 但這確實很混亂,並且不能保留初始速度。 如果玩家撞到一個角落,他將進入該角落,我將檢測到該情況,將其移回並使其速度無效。 只是感覺不對,笨拙。

我只是想不出一種處理此類案件的好方法。 我不會經常發生(因為很難復制),但偶爾會發生,這當然是不可接受的。

我真的很想什至沒有一個bugfix類型的東西,而是盡可能將其更好地集成到我的其他代碼中。 這不是強制性的,但是能夠做到這一點將很酷。 因此,如果你們中有人能向我扔東西,我將非常感激。

無論如何,我希望你能聽懂我想說的話。 由於英語不是我的母語,因此有時很難解釋這些事情。 我也很不擅長解釋事情:/

我想您可以再添加4種情況,當currentObject沿對角線移動時處理,不是嗎?

但是,您可能要根據邊界體積研究碰撞。

暫無
暫無

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

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