好吧,我有一個平鋪的地圖(很明顯),並實施了一個對我來說工作得非常好的碰撞檢測系統。儘管這些討厭的角落有麻煩。我知道這是爲什麼,因爲我甚至不檢查角落。這就是要點,我不知道該怎麼做。所以,首先這裏是我當前的代碼:尋找一種處理基於角落碰撞的瓷磚的好方法
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個其他的構造,如上,左和右。唯一真正的區別是循環和我鉗制速度的方式。
正如你所看到的,我只是循環遍歷所有可能碰撞的瓷磚。然後我將速度控制在一定範圍內,這樣會減慢速度。
現在,恐怕很難用單詞來解釋我的問題,所以我也必須發佈一張圖片。
在這張截圖黃色表示unpassable瓷磚,黑色是目前上面的代碼檢查碰撞和紅色瓷磚的玩家。
爲了向您展示問題的癥結所在,想象我在這個框架中加速向上並且正確。正如你所看到的,我的玩家右上角會出現一個碰撞,但是玩家只會移動到這個區域,因爲我沒有檢查它是否有碰撞。而且我也不會在下一幀中檢查它,因爲我不檢查我所在的區塊,因爲......我甚至不知道,這會背叛我的代碼背後的整個想法,不是嗎? :P
當然,我可以擴展我的「搜索」範圍,但是我會與瓷磚相撞,我不應該碰撞。 目前,我正在用一個額外的檢查來解決這個問題,我所有的邊界都與之重疊,並且......如果我找到任何東西,請將球員移回原處。但這實在太雜亂了,它不能保持最初的速度。如果玩家碰到一個角落,他會進入角落,我會檢測到這一點,將他移回去並且無效。這只是感覺不對,很笨重。
我似乎無法弄清楚處理這種情況的好方法。我不會經常發生(因爲它很難複製),但偶爾會發生,這當然是不可接受的。
我真的很想甚至沒有一個bugfix類型的東西,但它儘可能好地整合到我的其他代碼。這不是強制性的,但能夠做到這一點很酷。 所以我非常感謝你們中的任何一個人可以向我扔東西。
無論如何,我希望你能夠跟隨我想說的話。由於英語不是我的母語,有時候很難解釋這些事情。另外,我只是在解釋的東西真的很糟糕:/
說明有點冗長,但你有很好的英語:) –
那麼,爲什麼我加了我的第二個藉口:P。也有在線翻譯,所以幫助;) – user3093708