大家好,
好的,所以过去几天我一直在努力解决这个问题,但我真的什么都没有了,这就是我在这里的原因。
我正处于制作 2D 游戏的早期阶段。我为开发人员模式创建了一个“库存”,它显示了一个瓷砖网格(如图底部所示)。
您可以将这些图块放置在地图网格中,然后将它们作为字符保存到文本文件中,以供将来加载地图。
一切正常。但是,我希望这样当我在地图上放置一个路径图块(红色边框)时,当它被其他路径图块(蓝色边框)包围时,它会变为正确的边图块。
这是我的 Tilemap.java。
public class TileMap {
private Tile[][] tiles;
public TileMap(int width, int height) {
tiles = new Tile[width][height];
}
public int getWidth() {
return tiles.length;
}
public int getHeight() {
return tiles[0].length;
}
public Tile getTile(int x, int y) {
if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) {
return new VoidTile();
} else {
return tiles[x][y];
}
}
public void setTile(int x, int y, Tile tile) {
if (x >= 0 && y >= 0) {
tiles[x][y] = tile;
}
}
}
好的,所以在我的主游戏类中,我有一个 TileMap 地图;
当我将它们放在 mouseClicked(MouseEvent e) 方法中时,我试图通过检查即将放置的磁贴的上、下、左和右磁贴来更新磁贴,就像这样。
public void mouseClicked(MouseEvent e) {
Inventory.click(e);
if (e.getButton() == 1) {
tempTile = Inventory.getSelectedTile();
System.out.println("Selected Tile is " + tempTile);
} else if (e.getButton() == 3) {
boolean u = map.getTile(mouseGridX, mouseGridY - 1).connectsToPath;
boolean d = map.getTile(mouseGridX, mouseGridY + 1).connectsToPath;
boolean l = map.getTile(mouseGridX - 1, mouseGridY).connectsToPath;
boolean r = map.getTile(mouseGridX + 1, mouseGridY).connectsToPath;
boolean ul = map.getTile(mouseGridX - 1, mouseGridY - 1).connectsToPath;
boolean ur = map.getTile(mouseGridX + 1, mouseGridY - 1).connectsToPath;
boolean dl = map.getTile(mouseGridX - 1, mouseGridY + 1).connectsToPath;
boolean dr = map.getTile(mouseGridX + 1, mouseGridY + 1).connectsToPath;
if (!u && !l && !d && !r) {
map.setTile(mouseGridX, mouseGridY new PathTile(5));
}
}
}
这是我的 PathTile.java 构造函数,它使用基于网格的精灵表。获取精灵(GridX,GridY)
public PathTile(int tile) {
this.tile = tile;
connectsToPath = true;
switch (tile) {
case 1:
this.image = Sprite.getSprite(1, 1);
break;
case 2:
this.image = Sprite.getSprite(2, 1);
break;
case 3:
this.image = Sprite.getSprite(3, 1);
break;
case 4:
this.image = Sprite.getSprite(1, 2);
break;
case 5:
this.image = Sprite.getSprite(2, 2);
break;
case 6:
this.image = Sprite.getSprite(3, 2);
break;
case 7:
this.image = Sprite.getSprite(1, 3);
break;
case 8:
this.image = Sprite.getSprite(2, 3);
break;
case 9:
this.image = Sprite.getSprite(3, 3);
break;
case 10:
this.image = Sprite.getSprite(4, 2);
break;
case 11:
this.image = Sprite.getSprite(5, 2);
break;
case 12:
this.image = Sprite.getSprite(4, 3);
break;
case 13:
this.image = Sprite.getSprite(5, 3);
break;
}
}
这是基于 notch 的 Ludum Dare 游戏“MiniCraft”。但是,我似乎无法找到一种有效的方法来用我的方法实现它。
如果我的数学是正确的(可能不是),但这是否意味着有 65,535 个可能的结果?(4 * 4 * 4 * 4 * 4 * 4 * 4 * 4)??
我喜欢编程,但不是那么多,哈哈……
谁能帮我找出一个算法,或者至少给我指出正确的方向吗?
我知道这是一个非常大的问题,但所有的帮助将不胜感激!
节省。
编辑:这是缺口解决这个问题的方式。他使用类似于我的网格精灵表。然而,为了得到想要的精灵,他有一个 x & y 坐标,他乘以 32(网格框的大小)。
boolean u = !level.getTile(x, y - 1).connectsToGrass;
boolean d = !level.getTile(x, y + 1).connectsToGrass;
boolean l = !level.getTile(x - 1, y).connectsToGrass;
boolean r = !level.getTile(x + 1, y).connectsToGrass;
if (!u && !l) {
screen.render(x * 16 + 0, y * 16 + 0, 0, col, 0);
} else
screen.render(x * 16 + 0, y * 16 + 0, (l ? 11 : 12) + (u ? 0 : 1) * 32, transitionColor, 0);
if (!u && !r) {
screen.render(x * 16 + 8, y * 16 + 0, 1, col, 0);
} else
screen.render(x * 16 + 8, y * 16 + 0, (r ? 13 : 12) + (u ? 0 : 1) * 32, transitionColor, 0);
if (!d && !l) {
screen.render(x * 16 + 0, y * 16 + 8, 2, col, 0);
} else
screen.render(x * 16 + 0, y * 16 + 8, (l ? 11 : 12) + (d ? 2 : 1) * 32, transitionColor, 0);
if (!d && !r) {
screen.render(x * 16 + 8, y * 16 + 8, 3, col, 0);
} else
screen.render(x * 16 + 8, y * 16 + 8, (r ? 13 : 12) + (d ? 2 : 1) * 32, transitionColor, 0);
}
如您所见,他使用 (boolean ? true : false) 方法接收要为精灵添加的所需数字。
我遇到的问题是找出一种方法,我可以使用类似的算法来确定我需要使用哪个精灵。
这就是我所要求的。我什至会很高兴看到其他人如何克服这个问题。
谢谢