我正在尝试做一个非常简单的棋盘游戏(卡尔卡松),但是我在图形界面上遇到了很多麻烦。问题是我不知道如何在鼠标单击与网格窗格的行和列之间建立联系。
给出第一个图块,它总是添加到100、100网格的位置。您不会在代码中看到它,但是如果相邻的对象为空,则为每个添加的图块添加一个白色图块,因此看起来像这样:
然后,要求玩家在x = 99 y = 100,x = 101 y = 100,x的位置采取合法行动(我们不控制作弊者,所以是的,这将是一场虚弱的游戏) = 100 y = 99,x = 100 y = 101。
但是当我使用play()方法单击那里时,e.getSceneX();方法返回像素位置,我需要一种将其转换为有效行索引的方法。因此,这正在发生:
这是控制台输出:
在100 100处添加的XCCCC // //始终由程序指定,始终相同 在391380中添加了MFFCF图块
在这种情况下,我单击了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);
}
}
答案 0 :(得分:0)
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);
});
}
实际上是可行的。谢谢大家!