JavaFX,使用箭头键在网格窗格中移动节点
我正在与迷宫般的游戏作斗争。我正在尝试使用箭头键在网格窗格中移动“播放器”节点 这是我的事件处理程序: 公共类KeyListener实现EventHandler{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 =
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()进行调试你是怎么做到的?我很高兴。不客气。祝你以后好运。如果你还有任何问题,请随时提问!