2016-03-30 48 views
1

私は迷路のようなゲームに苦しんでいます。私は矢印キーを使用してGridPane内で "player"ノードを動かそうとしています。JavaFX、矢印キーでGridPane内のノードを移動

これは私のイベントハンドラです: パブリッククラスのKeyListenerはEventHandlerのarrowdownキーが押された場合に何が起こるかだけカバー{

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()); } 

を実装しています。 私の問題は、ノードが最初のキー押下後に1行下に移動するが、それ以降はそれ以上は動作しないが、System.out.println( "Player goes" + event.getCode())文が印刷されるということです。

提案がありますか?

+0

また、プレイヤーの位置は、最初のイベントの後にのみ更新されます。 –

+0

私の推測では、あなたのハンドラは最初の位置/ノードに対してのみ登録されていると思います。古いノードのイベントハンドラを削除して新しいノードに追加する必要がありますが、確かめるためには十分なコードが存在しません。そのようなことが起こっています。 – hotzst

+0

Mainクラスのメインシーンにハンドラを追加しました。私はGridPane自体にも追加しようとしました。 –

答えて

1

私は十分な情報を提供していませんが、私はいくつか前提をします。

prevXとprevYを変更する必要があります。あなたはprevYのsetterメソッドを持っている場合は、

this.player.setPrevY(this.player.getPrevY() + 1); 

としては、最初の反復、prevY == posYで、コメントで説明しました。

次に、posYprevY + 1に変異させる。従ってposY = prevY + 1。キャラクターは動く。

2回目の反復では、posY = prevY + 1です。したがって、this.player.setPosY(prevY + 1)を設定しても、同じ場所に残ります。

+0

あなたは良い点を作っています、スティーブン。私は今夜​​帰宅するときにあなたのアドバイスをしてあげます。 –

+0

実際、私は、プレーヤーの現在の位置を使って、メインからKeyListenerを呼び出します。私はちょうどprevXと呼ばれ、ハンドラ自体の内部にあります。 –

+0

私は、KeyListenerを呼び出すときに引数としてposXとposYのゲッターを使用します。 –

関連する問題