[英]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.