2016-05-26 8 views
0

Mein KeyPressed funktioniert, aber es gibt keine Änderung in avatarDX von meiner Methode moveLeft. Habe ich mit moveLeft etwas falsch gemacht? Es scheint, als sollte es einfach sein, aber ich bin mir nicht sicher, was ich falsch gemacht habe. Ich habe keine Fehlermeldungen.Verschieben eines Bildes auf Leinwand mit KeyPressed

Ich zeichne ein Bild auf einer Leinwand mit

gc.drawImage(avatar, avatarSX, avatarSY, avatarSW, avatarSH, avatarDX, avatarDY, avatarDW, avatarDH); 

Für KeyPressed Ich habe

canvas.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent ke) { 
      double speed = 2; 
      switch(ke.getCode()) { 
       case A: 
        System.out.println("pressed a"); 
        moveLeft(avatarDX, speed); 
        System.out.println(avatarDX); 
        break; 
      } 
     } 
}); 

Und ist moveleft

private void moveLeft(double avatarDX, double speed) { 
      while (avatarDX > 0) { 
       avatarDX -= speed; 
      } 
     } 

ich jede Hilfe dankbar wäre ich sehr bin neu dabei.

+0

Java ist Aufruf nach Wert (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value). Wenn Sie also den Wert Ihres Methodenparameters ändern, ändert das nichts an der lokalen Kopie dieses 'double'. – fabian

+0

Sie sollten auch einen Lambda-Ausdruck verwenden: 'camera.setOnKeyPressed (event -> {...});' – pzaenger

Antwort

1

Ein Grund (möglicherweise gibt es andere) Das Programm verhält sich nicht so, wie Sie es erwarten, ist, dass Sie über eine While-Schleife versuchen, Ihren Avatar zu steuern.

Dies wird nur die JavaFX-Anwendung anhalten, bis die Schleife abgeschlossen ist und dann den Bildschirm auf den endgültigen Zustand am Ende der Schleife aktualisieren. JavaFX ist kein Sofortzeichensystem, es ist ein beibehaltenes Zeichensystem, das nur dann eine Szene rendert, wenn Sie die Steuerung des JavaFX-Anwendungs-Threads an das JavaFX-System zurückgeben.

Stattdessen müssen Sie eine callback verwenden, um die Szene auf jedem pulse zu aktualisieren.

Ich schlage vor, Sie die folgende Methode verwenden:

  1. Wie Sie an diese neu sind, versuchen, die Anwendung zu schreiben, die JavaFX Szenengraph ist eher als ein Canvas. Die Programmierung des Szenengraphen ist für viele Dinge einfacher. Wenn Sie zu einem späteren Zeitpunkt feststellen, dass Canvas besser passt, können Sie zu diesem Zeitpunkt immer in Canvas konvertieren, wenn Sie das JavaFX-Programmiermodell besser verstehen.
  2. Review this sample Verschieben eines Zeichens um das Szenendiagramm mit Tastenbetätigungen.
  3. Versuchen Sie nicht, Ihren Charakter zu loopen. Verwenden Sie stattdessen entweder die eingebauten high level JavaFX animation facilities wie Übergänge, oder (wenn diese nicht gut passen, wie es hier wahrscheinlich der Fall ist), verwenden Sie die Low-Level-Schnittstelle AnimationTimer.
  4. Lesen Sie auf game loops and JavaFX und wenden Sie das Wissen, das Sie dort lernen, auf Ihr Programm an.
+0

Vielen Dank, das ist sehr hilfreich. Du hast mir alles gegeben, um den richtigen Weg zu finden. :) – Yoozernaym