2013-12-12 57 views
1

好吧,我有一個平鋪的地圖(很明顯),並實施了一個對我來說工作得非常好的碰撞檢測系統。儘管這些討厭的角落有麻煩。我知道這是爲什麼,因爲我甚至不檢查角落。這就是要點,我不知道該怎麼做。所以,首先這裏是我當前的代碼:尋找一種處理基於角落碰撞的瓷磚的好方法

 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個其他的構造,如上,左和右。唯一真正的區別是循環和我鉗制速度的方式。

正如你所看到的,我只是循環遍歷所有可能碰撞的瓷磚。然後我將速度控制在一定範圍內,這樣會減慢速度。

現在,恐怕很難用單詞來解釋我的問題,所以我也必須發佈一張圖片。

enter image description here

在這張截圖黃色表示unpassable瓷磚,黑色是目前上面的代碼檢查碰撞和紅色瓷磚的玩家。

爲了向您展示問題的癥結所在,想象我在這個框架中加速向上並且正確。正如你所看到的,我的玩家右上角會出現一個碰撞,但是玩家只會移動到這個區域,因爲我沒有檢查它是否有碰撞。而且我也不會在下一幀中檢查它,因爲我不檢查我所在的區塊,因爲......我甚至不知道,這會背叛我的代碼背後的整個想法,不是嗎? :P

當然,我可以擴展我的「搜索」範圍,但是我會與瓷磚相撞,我不應該碰撞。 目前,我正在用一個額外的檢查來解決這個問題,我所有的邊界都與之重疊,並且......如果我找到任何東西,請將球員移回原處。但這實在太雜亂了,它不能保持最初的速度。如果玩家碰到一個角落,他會進入角落,我會檢測到這一點,將他移回去並且無效。這只是感覺不對,很笨重。

我似乎無法弄清楚處理這種情況的好方法。我不會經常發生(因爲它很難複製),但偶爾會發生,這當然是不可接受的。

我真的很想甚至沒有一個bugfix類型的東西,但它儘可能好地整合到我的其他代碼。這不是強制性的,但能夠做到這一點很酷。 所以我非常感謝你們中的任何一個人可以向我扔東西。

無論如何,我希望你能夠跟隨我想說的話。由於英語不是我的母語,有時候很難解釋這些事情。另外,我只是在解釋的東西真的很糟糕:/

+0

說明有點冗長,但你有很好的英語:) –

+0

那麼,爲什麼我加了我的第二個藉口:P。也有在線翻譯,所以幫助;) – user3093708

回答

0

我想你可以只添加4個案件,當currentObject移動在對角線,沒有?

但是,您可能想要根據邊界卷調查衝突。

+0

是的,我可以做到這一點。我只是在尋找......你知道乾淨的解決方案。它都坐在一個模擬課上,它很嚇人,因爲它也是:/另外我正在使用包圍體進行彈丸碰撞,但我想到爲什麼要做這樣的角色,如果這種方式工作得很好? :P – user3093708