我一直在想辦法去做一個城市/殖民地建築類型的遊戲,一切都是由玩家放置和建造的,例如每個牆壁,就像'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";
}
}
每個'Tile'都可以存儲它的鄰居作爲參考。所以每個「瓦片」都會有4個或8個鄰居(對角鄰居?)。那麼你只需要檢查每個牆壁/瓷磚的4/8牆。 – Springrbua