JavaFX,使用箭头键在网格窗格中移动节点

JavaFX,使用箭头键在网格窗格中移动节点,java,javafx,nodes,eventhandler,gridpane,Java,Javafx,Nodes,Eventhandler,Gridpane,我正在与迷宫般的游戏作斗争。我正在尝试使用箭头键在网格窗格中移动“播放器”节点 这是我的事件处理程序: 公共类KeyListener实现EventHandler{ public KeyListener(Player player, int prevX, int prevY, GridPane mapGrid) { this.player = player; this.prevX = prevX; this.prevY = prevY; this.mapGrid =

我正在与迷宫般的游戏作斗争。我正在尝试使用箭头键在网格窗格中移动“播放器”节点

这是我的事件处理程序: 公共类KeyListener实现EventHandler{

public KeyListener(Player player, int prevX, int prevY, GridPane mapGrid) {
    this.player = player;
    this.prevX = prevX;
    this.prevY = prevY;
    this.mapGrid = mapGrid;
}

// Method for finding rectangle in gridpane:
private Node getNode(GridPane gridPane, int col, int row) {
    for (Node node : gridPane.getChildren()) {
        if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
            return node;
        }
    }
    return null;
}

@Override
public void handle(KeyEvent event) {
    try {
        System.out.println("Player goes " + event.getCode());
        if (event.getCode() == KeyCode.DOWN) {
            this.player.setPosX(prevX);
            this.player.setPosY(prevY + 1);
            Node targetNode = getNode(mapGrid, prevX, prevY+1);
            System.out.println(targetNode.toString());
            System.out.println(this.player.getPosX() + " " + this.player.getPosY());
            mapGrid.add(this.player.playerLook(), player.getPosX(), player.getPosY()); }
仅涵盖按下箭头向下键时发生的情况。 我的问题是,节点在第一次按键后向下移动一行,但之后它不再工作,而是打印System.out.println(“Player goes”+event.getCode())语句


有什么建议吗?

虽然我没有得到足够的信息,但我会做出一些假设

你应该变异
prevX
prevY
。如果你有
prevY
的setter方法

this.player.setPrevY(this.player.getPrevY() + 1);
正如注释中所解释的,在第一次迭代时,
prevY==posY

然后,它将
posY
变为
prevY+1
。因此
posY=prevY+1
。角色移动


在第二次迭代中,
posY=prevY+1
。因此,即使您设置
this.player.setPosY(prevY+1)
,它仍保持在相同的位置。

尽管我没有提供足够的信息,但我会做出一些假设

你应该变异
prevX
prevY
。如果你有
prevY
的setter方法

this.player.setPrevY(this.player.getPrevY() + 1);
正如注释中所解释的,在第一次迭代时,
prevY==posY

然后,它将
posY
变为
prevY+1
。因此
posY=prevY+1
。角色移动



在第二次迭代中,
posY=prevY+1
。因此,即使您设置了
this.player.setPosY(prevY+1)
,它保持在同一位置。

此外,玩家的位置仅在第一个事件后更新。我猜您的处理程序仅为初始位置/节点注册。您必须删除旧节点上的事件处理程序,然后将其添加到新节点上,但是没有足够的代码来确保这就是发生的情况ning。我将处理程序添加到我的主类的主场景中。我还尝试将其添加到GridPane本身。问题是您不更新prevX和prevY。您必须向我展示要回答的全部代码,但我假设setPosX和setPosY不会变异prevX或prevY。因此,在第一次迭代中,当prevY==posY时,它可以工作,但当prevY==(位置-1),它将变为posY=prevY+1,因此保持在同一位置。此外,玩家的位置仅在第一个事件后更新。我猜您的处理程序仅为初始位置/节点注册。您必须删除旧节点上的事件处理程序,并将其添加到新节点上,但是没有足够的代码继续进行更新re,这就是正在发生的事情。我将处理程序添加到我的主类的主场景中。我还尝试将其添加到GridPane本身。问题是您不更新prevX和prevY。您必须向我显示要回答的全部代码,但我假设setPosX和setPosY不会变异prevX或prevY。因此,在第一次迭代中,当prevY==posY时,它可以工作,但是当prevY==(posY-1)时,它变为posY=prevY+1,因此保持在同一位置。史蒂文,你说得不错。我今晚回家后会给你提个建议。事实上,我确实使用玩家当前的位置从主控台给KeyListener打电话。我刚刚在处理程序中称它为prevX和prevY。我使用posX和posY的getter作为调用KeyListener时的参数。那么,单独发送prevX和prevY有什么意义呢?为什么不在处理程序中使用player.getPos()并将player传入呢?这将减少很多混乱。通过打印prevX、prevY、player.getPosX()和player.getPosY()进行调试你是怎么做到的?我很高兴。不客气。祝你以后好运,如果你还有任何问题,尽管问吧!史蒂文,你说得很好。今晚回家后我会给你提个建议。事实上,我会用球员的当前位置从我的主打电话给键盘监听器。我刚刚叫它prevX和prev在处理程序本身内部。我在调用KeyListener时使用posX和posY的getter作为参数。那么,发送单独的prevX和prevY有什么意义呢?为什么不在处理程序内部使用player.getPos()并将player传入呢?这将减少很多混乱。通过打印prevX、prevY、player.getPosX()和player.getPosY()进行调试你是怎么做到的?我很高兴。不客气。祝你以后好运。如果你还有任何问题,请随时提问!