2014-04-11 37 views
0

我一直在想辦法去做一個城市/殖民地建築類型的遊戲,一切都是由玩家放置和建造的,例如每個牆壁,就像'Rimworld'那樣。檢查城市建築類型遊戲中其他瓷磚周圍的其他「瓷磚/牆壁」。像'Rimworld'

現在我唯一的問題是放置每一塊牆。我一直在努力爲牆壁找到一個好方法,當它們完成創建/建造時,他們檢查周圍的其他牆壁,然後改變它們的外觀,這取決於牆壁是什麼。

所以,如果我把牆上的一排:

OOOOO

然後將牆的另一排在它們下面這樣:

OOOOO

Ø

Ø

O

我希望它能自動改變角落裏的牆壁,角落裏的一塊,其他的東西也會變成他們想去的方向。就像'Down'的方式

我希望你能明白我在說什麼。

我一直在想辦法解決這個問題。一種方法是循環遍歷包含每個牆的列表,然後再次循環,然後檢查圍牆正在檢查的牆。但是,如果我說,1000面牆,那真的很慢,每牆檢查1000次,似乎不是一個好辦法。

如果有幫助,我使用Libgdx/Java。

我不需要代碼,只需要僞代碼,或者解釋執行此操作的最佳方法,但是代碼會很有幫助。

--------編輯------------

如果有人有興趣,我解決我自己通過使用下面這個問題:這是不是最好的方式,但它的作品。如果有更好的方式來做到這一點,請按照我所做的方式(有點長,如果有很多陳述),請分享。

發生什麼事是你把你想檢查瓷磚的x和y,所有的東西都是基於此。這一切都按我想要的方式工作,但似乎有點混亂。我將如何去清理這個代碼?

public void checkWallType(int x, int y) { 
    boolean wallAtTop = false; 
    boolean wallAtRight = false; 
    boolean wallAtBottom = false; 
    boolean wallAtLeft = false; 

    if (tileMap[x][y - 1] != null) { 
     if (tileMap[x][y - 1].type == "Wall") { 
      wallAtTop = true; 
     } 
    } 
    if (tileMap[x + 1][y] != null) { 
     if (tileMap[x + 1][y].type == "Wall") { 
      wallAtRight = true; 
     } 
    } 
    if (tileMap[x][y + 1] != null) { 
     if (tileMap[x][y + 1].type == "Wall") { 
      wallAtBottom = true; 
     } 
    } 
    if (tileMap[x - 1][y] != null) { 
     if (tileMap[x - 1][y].type == "Wall") { 
      wallAtLeft = true; 
     } 
    } 


    if (wallAtTop && wallAtRight == false && wallAtBottom == false && wallAtLeft == false) { 
     tileMap[x][y].wallType = "BottomEnd"; 
    } 
    else if (wallAtTop == false && wallAtRight && wallAtBottom == false && wallAtLeft == false) { 
     tileMap[x][y].wallType = "LeftEnd"; 
    } 
    else if (wallAtTop == false && wallAtRight == false && wallAtBottom && wallAtLeft == false) { 
     tileMap[x][y].wallType = "TopEnd"; 
    } 
    else if (wallAtTop == false && wallAtRight == false && wallAtBottom == false && wallAtLeft) { 
     tileMap[x][y].wallType = "RightEnd"; 
    } 

    else if (wallAtTop && wallAtRight == false && wallAtBottom && wallAtLeft == false) { 
     tileMap[x][y].wallType = "TopBottom"; 
    } 
    else if (wallAtTop == false && wallAtRight && wallAtBottom == false && wallAtLeft) { 
     tileMap[x][y].wallType = "LeftRight"; 
    } 

    else if (wallAtTop && wallAtRight && wallAtBottom == false && wallAtLeft == false) { 
     tileMap[x][y].wallType = "BottomLeft"; 
    } 
    else if (wallAtTop == false && wallAtRight && wallAtBottom && wallAtLeft == false) { 
     tileMap[x][y].wallType = "LeftTop"; 
    } 
    else if (wallAtTop == false && wallAtRight == false && wallAtBottom && wallAtLeft) { 
     tileMap[x][y].wallType = "TopRight"; 
    } 
    else if (wallAtTop && wallAtRight == false && wallAtBottom == false && wallAtLeft) { 
     tileMap[x][y].wallType = "BottomRight"; 
    } 

    else if (wallAtTop && wallAtRight && wallAtBottom && wallAtLeft == false) { 
     tileMap[x][y].wallType = "TopRightBottom"; 
    } 
    else if (wallAtTop == false && wallAtRight && wallAtBottom && wallAtLeft) { 
     tileMap[x][y].wallType = "RightBottomLeft"; 
    } 
    else if (wallAtTop && wallAtRight == false && wallAtBottom && wallAtLeft) { 
     tileMap[x][y].wallType = "BottomLeftTop"; 
    } 
    else if (wallAtTop && wallAtRight && wallAtBottom == false && wallAtLeft) { 
     tileMap[x][y].wallType = "LeftTopRight"; 
    } 

    else if (wallAtTop && wallAtRight && wallAtBottom && wallAtLeft) { 
     tileMap[x][y].wallType = "Open"; 
    } 
} 
+0

每個'Tile'都可以存儲它的鄰居作爲參考。所以每個「瓦片」都會有4個或8個鄰居(對角鄰居?)。那麼你只需要檢查每個牆壁/瓷磚的4/8牆。 – Springrbua

回答

0

爲什麼你需要檢查所有1000個牆?如果你有瓷磚,你有座標。如果你有座標,你可以檢查x-1 | y,x + 1 | y,x | y-1和x | y + 1的瓦片上有什麼。

1

您有多少個不同的瓷磚需要代表牆?如果這些數量不是太多,則規則的數量(何時顯示哪個牆)應該很小。所以,讓我們假設你有:

  • 一個瓷磚的牆壁水平排列,沒有哥們其頂部或底部
  • 一個平鋪的垂直排列的牆壁,沒有哥們其左側或右側
  • 四個不同(右,下),(左,下),(右上,頂部)和(左上,頂部)的牆壁瓷磚

這只是一個例子。這6條規則是互相排斥的,這意味着只有其中的一條可以匹配。要決定應用哪個規則,只需創建一個Chain-Of-Responsibility,其中每個Handler都是這些規則之一。規則需要知道哪個牆找到正確的瓷磚。因此,您必須通過地圖本身和牆的位置來找到合適的圖塊。現在鏈中的每個規則檢查它是否匹配。如果是這樣,規則返回瓦片。否則,規則將沿着鏈傳遞輸入參數。如果沒有規則匹配,則standard牆地磚是適當的。

您可以在玩家投擲牆壁時立即應用規則,或者在最後對整個地圖進行後期處理。延遲處理需要檢查地圖的每個位置,或者要記住牆位置。我會建議及時完成。這樣,您必須只處理掉落的牆壁及其所有相鄰的牆壁,這對球員來說效​​率更高,響應更快。

希望我的建議可以幫助你。玩的開心!