在城市建筑类型的游戏中检查其他瓷砖周围的其他“瓷砖/墙壁”。喜欢'Rimworld'

时间:2014-04-11 12:00:18

标签: java logic libgdx

我一直想找到一种方法来做一个城市/殖民地建筑类型的游戏,其中一切都由玩家放置和建造,例如每个墙壁,就像'Rimworld'那样。

现在我遇到的唯一问题是放置每一块墙。我一直试图为墙壁找到一个好方法,当他们完成创建/建造时,他们检查周围的其他墙壁,然后改变他们的外观,取决于其他墙壁是什么。

所以,如果我放置一排墙:

O O O O O

然后在它们下方放置另一排墙壁:

O O O O O

0

0

0

我希望它能够自动将角落里的墙壁改成角落,将其他部分改成他们想去的方向。就像面对'Down'的方式

我希望你能理解我想说的话。

我一直在努力想办法解决这个问题。一种方法是循环通过包含每个墙壁的List,然后再次循环,并检查墙壁周围的墙壁。但是,如果我说了1000个墙,那么那真的很慢,每个墙检查1000次,看起来不是一个很好的方法。

如果有帮助,我使用的是Libgdx / Java。

我不需要代码,只需要伪代码或解释最佳方法,但代码会有所帮助。

-------- EDIT ------------

如果有人感兴趣,我通过以下方式解决了我自己的问题:这不是最好的方法,但它有效。如果有一个更好的方法来做到这一点,我已经完成了(它有点长,很多if语句)请分享。

你想要检查的瓷砖的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";
    }
}

2 个答案:

答案 0 :(得分:1)

您有多少不同的瓷砖代表墙?如果那些不是太多,规则的数量(何时显示哪个墙)也应该很小。所以我们假设你有:

  • 一块瓷砖,墙面水平对齐,顶部或底部没有好友
  • 一个用于垂直对齐墙壁的瓷砖,左边或右边没有好友
  • 墙上有四个不同的瓷砖(右,底),(左,下),(右,上)和(左,上)哥们

这只是一个例子。这6条规则是互斥的,这意味着只有其中一条匹配。要确定要应用哪个规则,只需创建Chain-Of-Responsibility,其中每个Handler都是其中一个规则。规则需要知道哪个墙找到合适的瓷砖。因此,您必须传递地图本身和墙壁的位置,以找到适当的瓷砖。现在链中的每个规则都会检查它是否匹配。如果是,则规则返回磁贴。否则,规则会沿着链传递输入参数。如果没有规则匹配,则standard墙拼贴是合适的。

您可以在玩家掉墙后立即应用规则,也可以在最后对整个地图进行后处理。延迟处理需要检查地图的每个位置,或者记住墙壁位置。我建议及时做。这样,您只需要处理掉落的墙壁及其所有相邻的墙壁,这对玩家来说效率更高,响应更快。

希望我的建议可以帮到你。玩得开心!

答案 1 :(得分:0)

为什么需要检查所有1000面墙?如果你有瓷砖,你有坐标。如果你有坐标,你可以检查x-1 | y,x + 1 | y,x | y-1和x | y + 1的图块上的内容。