我一直想找到一种方法来做一个城市/殖民地建筑类型的游戏,其中一切都由玩家放置和建造,例如每个墙壁,就像'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";
}
}
答案 0 :(得分:1)
您有多少不同的瓷砖代表墙?如果那些不是太多,规则的数量(何时显示哪个墙)也应该很小。所以我们假设你有:
这只是一个例子。这6条规则是互斥的,这意味着只有其中一条匹配。要确定要应用哪个规则,只需创建Chain-Of-Responsibility,其中每个Handler
都是其中一个规则。规则需要知道哪个墙找到合适的瓷砖。因此,您必须传递地图本身和墙壁的位置,以找到适当的瓷砖。现在链中的每个规则都会检查它是否匹配。如果是,则规则返回磁贴。否则,规则会沿着链传递输入参数。如果没有规则匹配,则standard
墙拼贴是合适的。
您可以在玩家掉墙后立即应用规则,也可以在最后对整个地图进行后处理。延迟处理需要检查地图的每个位置,或者记住墙壁位置。我建议及时做。这样,您只需要处理掉落的墙壁及其所有相邻的墙壁,这对玩家来说效率更高,响应更快。
希望我的建议可以帮到你。玩得开心!
答案 1 :(得分:0)
为什么需要检查所有1000面墙?如果你有瓷砖,你有坐标。如果你有坐标,你可以检查x-1 | y,x + 1 | y,x | y-1和x | y + 1的图块上的内容。