我正在尝试使用JavaFX进行桌游。游戏是Carcassone。
我决定使用GridPane绘制板,因此我可以使用x,y坐标访问每个图块,这对于作为HashMap的逻辑板是有意义的,因此对于每个x,y位置,我添加逻辑板上的图块,它也将添加到绘图板(网格窗格)中。
但是,对于GridPane中添加的每个图块,我想在相邻的空图块中添加“空图块”。假设绿色的瓦片是播放的瓦片,蓝色的是相邻的瓦片,白色的是网格窗格的其余部分,它是空白的(空值):
因此,新的图块(绿色)只能添加到蓝色位置,并且如果相邻的空图块为空,则添加的每个绿色图块都将变为“蓝色”。
问题是,如何知道相邻的图块是否为空。我发现了这个功能:
private boolean tileEmpty(int row, int column, GridPane gridPane) {
Node result = null;
ObservableList<Node> childrens = gridPane.getChildren();
for (Node node : childrens) {
if(GridPane.getRowIndex(node) == row && GridPane.getColumnIndex(node) == column) {
result = node;
break;
}
}
return (result == null);
}
但是当我以这种方式创建网格时,它给了我NullPointerException:
private void crearTauler() {
GridPane _taulerVisual = new GridPane();
_taulerVisual.setPrefSize(800,600);
_taulerVisual.setAlignment(Pos.CENTER);
_taulerVisual.setGridLinesVisible(true);
_taulerVisual.setHgap(4);
_taulerVisual.setVgap(3);
}
这是tile加法器功能,与其他功能在同一类中:
public class myTile extends Imageview {...}
。
public void addVisualTile(myTile r, int x, int y) {
myVisualTile rV = new myVisualTile(r);
myVisualTile add = new myVisualTile();
_taulerVisual.add(rV, x, y);
// And this is the code I'd to make work:
if (tileEmpty(x-1, y, _taulerVisual)) {
_taulerVisual.add(add, x-1, y);
}
else if (tileEmpty(x+1, y, _taulerVisual)) {
_taulerVisual.add(add, x+1, y);
}
else if (tileEmpty(x, y-1, _taulerVisual)) {
_taulerVisual.add(add, x, y-1);
}
else if (tileEmpty(x, y+1, _taulerVisual)) {
_taulerVisual.add(add, x, y+1);
}
}
所以,我无法在网格窗格中进行迭代,因为除了一些孩子是空孩子以外,所有孩子都没有。有解决这个问题的主意吗?