Я пытаюсь сделать настольную игру с использованием JavaFX.Игра - Carcassone.
Я решил использовать GridPane для рисования доски, чтобы я мог получить доступ с координатами x, y к каждой плитке, и это имеет смысл с логической доской, которая является HashMap, поэтомудля каждой позиции x, y я добавляю плитку в логическую доску, и она также добавляется в доску рисования (область сетки).
Но для каждой плитки, добавленной в GridPane, я хочу добавить "voidплитка "в соседних плитках, которые пусты.Давайте предположим, что зеленые плитки - это играемые плитки, синий - это смежные, а белый - остальная часть области сетки, в которой она пуста (пустое значение):
Итак, новые плитки (зеленые) могут быть добавлены только к синим позициям, и для каждой зеленой зеленой плитки, если соседние пустые, они получают "синий".
Так что проблема в том, как узнать, пуста ли соседняя плитка.Я нашел эту функцию:
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);
}
И это функция сумматора плиток, котораяв том же классе, что и другие функции:
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);
}
}
Так что дело в том, что я не могу выполнять итерации в области сетки, поскольку все дочерние элементы, кроме некоторых, пусты.Любая идея, чтобы решить эту проблему?