Я пытаюсь сделать довольно простую настольную игру (Каркассон), но у меня много проблем с графическим интерфейсом. Проблема в том, что я не вижу способа установить связь между щелчками мыши, строкой и столбцами сетки.
Дается первая плитка, и она всегда добавляется к позиции 100, 100. Вы не увидите этого в коде, но для каждой добавленной плитки, если смежные области пусты, добавляется белая плитка, поэтому она выглядит так:
Затем от игрока ожидается законный ход (мы не контролируем мошенников, так что да, это будет слабая игра) в позициях x = 99 y = 100, x = 101 y = 100, x = 100 лет = 99, х = 100 лет = 101.
Но когда я щелкаю там с помощью метода play (), то e.getSceneX (); Метод возвращает мне положение пикселя, и мне нужен способ, чтобы преобразовать его в действительный индекс строки. Итак, это происходит:
Это вывод консоли:
плитка XCCCC добавлена при 100 100 // это всегда задается программой, всегда одинаково
плитка MFFCF добавлена в 391 380
В этом случае я щелкнул по области сетки x = 100 y = 101, но мышь вернула мне пиксель 391, 380.
Есть идеи?
Это структура моего кода:
public final class GUI extends Application {
private Game _game;
private GridPane _visualBoard;
@Override
public void start(final Stage primaryStage) {
// some stuff setting the gridpane, which will be inside a scrollpane and the scrollpane will be inside a borderpane which will alse have 2 additional VBoxes with the current turn information
play();
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
public void play() {
_visualBoard.setOnMousePressed((MouseEvent e) -> {
double x = e.getSceneX();
double y = e.getSceneY();
_game.doMove(x, y);
});
}
public void insertTile(myTile r, int x, int y) {
myVisualTile rV = new myVisualTile(r);
_visualBoard.add(rV, x, y);
}
А это классная игра:
public class Game {
private GUI _gui;
private List<Player> _players; // An arraylist of players
private int _currentPlayer; // The index of the current player in the ArrayList
private Board _board; // The logical board, totally separeted from the gridpane
private tileStack _stack;
public void doMove(double x, double y) {
int ax = (int) x;
int ay = (int) y;
if (_stack.isEmpty()) {
System.out.println("Game finnished");
//stuff
}
else {
myTile r = _stack.poll(); // takes the first tile of the stack
_gui.insertTile(r, ax, ay);
}
}