2012-10-19 33 views
1

我正在使用Cocos2D製作一個休閒的基於網格的2D iPhone遊戲。網格是一個「交錯」的六角形網格,由均勻大小和間隔的圓盤組成。它看起來像this二維六角網格上的碰撞檢測

我已經將網格存儲在二維數組中。另外我有一個「周圍」網格單元的概念。即圍繞特定細胞的六個網格細胞(除了邊界上的細胞可能少於六個)。

無論如何,我正在測試一些碰撞檢測,並沒有像我計劃的那樣工作。下面是我當前如何做碰撞檢測的移動盤多數民衆贊成接近固定組光盤:最接近於使用移動單元的XY位置移動的細胞周圍電網的

  • 獲取列表網格單元的

    1. 計算IJ座標使用ij座標的單元格
    2. 檢查周圍的單元格。如果它們都是空的,那麼不會發生碰撞
    3. 如果我們有一些非空周圍的單元格,那麼將盤中心之間的距離與碰撞所需的某個最小距離進行比較
    4. 如果發生碰撞, grid cell ij

    所以這個工作,但不是太好。我已經考慮過一種可能更簡單的暴力方法,我只是比較遊戲循環中每一步的移動光盤和所有固定光盤。由於固定盤片數量最大爲300,因此在性能方面可能是可行的。如果不是的話,那麼可以使用一些空間分區數據結構,但是這樣感覺太複雜了。

    在這樣的遊戲中碰撞檢測有哪些常見方法和最佳實踐?

  • 回答

    2

    我相信你應該能夠將移動光盤的xy座標精確地映射到最近的單元格。

    +------+-------+-------+ odd rows 
        |  |  |  | 
        |  |  |  | 
    +---|--+---|---+---|----+ | 
    | +--|---+---|---+----|--+ 
    |  | x  |  | <- even rows 
    | +--|---+---|---+----|--+ odd rows 
    +---|--+---|-y-+---|----+ | 
        |  |  |  | 
        |  |  |  | 
        +------+-------+-------+ 
    

    X座落於even_row [0] [1],而點ý位於 在odd_row [1] [1],並且同時在even_row [0] [1]。 最多有兩個地方,然後可以計算出哪一個最接近。 (沒有理由甚至在一個不同的陣列中保留奇數行...)

    您應該能夠導出將y映射到奇數行和偶數行的數學公式。

    +0

    確實,我已經這樣做了。這在衝突檢測算法的早期就是在獲取周圍單元列表之前的一個步驟。 – SundayMonday