Добавить узел в сетке с помощью мыши - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь сделать довольно простую настольную игру (Каркассон), но у меня много проблем с графическим интерфейсом. Проблема в том, что я не вижу способа установить связь между щелчками мыши, строкой и столбцами сетки.

Дается первая плитка, и она всегда добавляется к позиции 100, 100. Вы не увидите этого в коде, но для каждой добавленной плитки, если смежные области пусты, добавляется белая плитка, поэтому она выглядит так:

enter image description here

Затем от игрока ожидается законный ход (мы не контролируем мошенников, так что да, это будет слабая игра) в позициях x = 99 y = 100, x = 101 y = 100, x = 100 лет = 99, х = 100 лет = 101.

Но когда я щелкаю там с помощью метода play (), то e.getSceneX (); Метод возвращает мне положение пикселя, и мне нужен способ, чтобы преобразовать его в действительный индекс строки. Итак, это происходит:

enter image description here

Это вывод консоли:

плитка 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);
    }
}

1 Ответ

0 голосов
/ 20 мая 2019
public void play() {
        _visualBoard.setOnMousePressed((MouseEvent e) -> {
            Node source = (Node)e.getTarget() ;
            Integer x = GridPane.getColumnIndex(source);
            Integer y = GridPane.getRowIndex(source);

            _game.doMove(x, y);
        });
}

Это действительно сработало. Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...