2016-05-10 4 views
0

Für mein Schulprojekt muss ich ein Spiel machen, wo eine Kanone eine Kugel zu einem Flugzeug schießen muss, das Problem ist, wenn wir schießen, können wir alle Position sehen (X. Y) des Geschosses auf der Konsole aber die Kugel auf dem UIJavaFX Update Kugelposition UI in einer Schleife

Hier ist der Testcode nicht aktualisiert:

vel = Slider.getValue(); 
double angle = panelNero.getRotate(); 
boolean dead = false; 

while (dead == false) { 
    double X = P.getLayoutX(); 
    double Y = P.getLayoutY(); 
    if (X > 1 && Y > 1 && X < MP.getWidth() && Y < MP.getHeight()) { 
     System.out.println("x: " + X + " y: " + Y + " maxX: " + MP.getWidth() + " maxY: " + MP.getHeight()); 

     double x = P.getLayoutX(); 
     double y = P.getLayoutY(); 
     P.setLayoutX(x += (Math.cos(Math.toRadians(angle)) * vel)); 
     P.setLayoutY(y += (Math.cos(Math.toRadians(angle)) * vel)); 
     System.out.println("VIVO"); 
     try { 
      TimeUnit.MILLISECONDS.sleep(500); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(FileFXMLController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } else { 
     System.out.println("MORTO"); 

     P.setLayoutX(pro.posX); 
     P.setLayoutY(pro.posY); 
     dead = true; 
    } 
} 
+0

Mögliche Duplikat [JavaFX periodische Hintergrundaufgabe] (http://stackoverflow.com/questions/9966136/javafx-periodic-background-task) – fabian

Antwort

0

Bitte werfen Sie einen Blick auf diesen Beitrag: Platform.runLater and Task in JavaFX

Sie verwenden Platform.runlater() zu Aktualisiere deine GUI von einem Nicht-GUI-Thread. In diesem Fall wird Ihre Aktualisierungsanforderung in eine Warteschlange gestellt und vom GUI-Thread so schnell wie möglich bearbeitet.

Da dies jedoch eine komplexere Iteration ist, können Sie einen Task auf einem neuen Thread verwenden.

Ich schlage vor, Sie so etwas wie diese verwenden:

Task task = new Task<Void>() { 
    @Override 
    public Void call() throws Exception { 
     while (dead == false) { 
      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        P.setLayoutX(...); 
        P.setLayoutY(...); 
       } 
      }); 
      Thread.sleep(500); 
     } 
    } 
}; 
Thread th = new Thread(task); 
th.start();