2015-10-13 87 views
0

當我運行這段代碼時,當鼠標點擊時動作會停止。 當我點擊鼠標時球會停止動作。儘管我點擊鼠標來添加其他球,但我如何讓球繼續執行動作。javafx時間軸和鼠標事件

import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Bounds; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class GamePractice extends Application { 

    public static Circle circle; 
    public static Pane canvas; 

    @Override 
    public void start(final Stage primaryStage) { 

     canvas = new Pane(); 
     final Scene scene = new Scene(canvas, 800, 600); 

     primaryStage.setTitle("Game"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     circle = new Circle(15, Color.BLUE); 
     circle.relocate(100, 100); 

     canvas.getChildren().addAll(circle); 


     final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), new EventHandler<ActionEvent>() { 

      double deltaX = (double)(Math.random()*10) + 3; 
      double deltaY = (double)(Math.random()*10) + 3; 
      @Override 
      public void handle(final ActionEvent t) { 
       circle.setLayoutX(circle.getLayoutX() + deltaX); 
       circle.setLayoutY(circle.getLayoutY() + deltaY); 

       final Bounds bounds = canvas.getBoundsInLocal(); 
       final boolean atRightBorder = circle.getLayoutX() >= (bounds.getMaxX() - circle.getRadius()); 
       final boolean atLeftBorder = circle.getLayoutX() <= (bounds.getMinX() + circle.getRadius()); 
       final boolean atBottomBorder = circle.getLayoutY() >= (bounds.getMaxY() - circle.getRadius()); 
       final boolean atTopBorder = circle.getLayoutY() <= (bounds.getMinY() + circle.getRadius()); 

       if (atRightBorder || atLeftBorder) { 
        deltaX *= -1; 
       } 
       if (atBottomBorder || atTopBorder) { 
        deltaY *= -1; 
       } 

      } 
     })); 

     scene.setOnMousePressed(new EventHandler<MouseEvent>() {   
      @Override   
      public void handle(MouseEvent event) { 
       if (event.getButton() == MouseButton.PRIMARY) { 
        if (!(canvas.getChildren().isEmpty())) { 
         canvas.getChildren().remove(0); 
        } 
       } 
       else { 
        int red = (int)(Math.random()*256); 
        int green = (int)(Math.random()*256); 
        int blue = (int)(Math.random()*256); 
        int x = (int)(Math.random()*801); 
        int y = (int)(Math.random()*601); 
        circle = new Circle(15, Color.rgb(red, green, blue)); 
        circle.relocate(x, y); 
        canvas.getChildren().addAll(circle); 
       } 
      }  
     }); 

     loop.setCycleCount(Timeline.INDEFINITE); 
     loop.play(); 
    } 

    public static void main(final String[] args) { 
     launch(args); 
    } 
} 
+0

你能後的代碼進行編譯?這是真的不清楚這應該做什麼。 (您正在每秒重置場景中的事件處理程序100次?) –

+0

我已編輯它。現在,當我點擊右鍵添加新球時,先前的球會停止運動。我想要所有的球移動。 – IPO

+0

當然,因爲動畫只更新一個圓圈,並且替換了它所引用的圓圈。你需要保留一個'List '。順便說一句,爲什麼你讓這些字段是靜態的? –

回答

0

剛剛創建的每個圓圈的動畫:

import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Bounds; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class GamePractice extends Application { 

    private Pane canvas; 

    @Override 
    public void start(final Stage primaryStage) { 

     canvas = new Pane(); 
     final Scene scene = new Scene(canvas, 800, 600); 

     primaryStage.setTitle("Game"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     addCircle(100, 100, Color.BLUE); 


     scene.setOnMousePressed(new EventHandler<MouseEvent>() {   
      @Override   
      public void handle(MouseEvent event) { 
       if (event.getButton() == MouseButton.PRIMARY) { 
        if (!(canvas.getChildren().isEmpty())) { 
         canvas.getChildren().remove(0); 
        } 
       } 
       else { 
        int red = (int)(Math.random()*256); 
        int green = (int)(Math.random()*256); 
        int blue = (int)(Math.random()*256); 
        int x = (int)(Math.random()*801); 
        int y = (int)(Math.random()*601); 
        addCircle(x, y, Color.rgb(red, green, blue)); 
       } 
      }  
     }); 

    } 

    private void addCircle(double x, double y, Color color) { 
     Circle circle = new Circle(15, color); 
     circle.relocate(x, y); 

     canvas.getChildren().addAll(circle); 


     final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), new EventHandler<ActionEvent>() { 

      double deltaX = (double)(Math.random()*10) + 3; 
      double deltaY = (double)(Math.random()*10) + 3; 


      @Override 
      public void handle(final ActionEvent t) { 
       circle.setLayoutX(circle.getLayoutX() + deltaX); 
       circle.setLayoutY(circle.getLayoutY() + deltaY); 

       final Bounds bounds = canvas.getBoundsInLocal(); 
       final boolean atRightBorder = circle.getLayoutX() >= (bounds.getMaxX() - circle.getRadius()); 
       final boolean atLeftBorder = circle.getLayoutX() <= (bounds.getMinX() + circle.getRadius()); 
       final boolean atBottomBorder = circle.getLayoutY() >= (bounds.getMaxY() - circle.getRadius()); 
       final boolean atTopBorder = circle.getLayoutY() <= (bounds.getMinY() + circle.getRadius()); 

       if (atRightBorder || atLeftBorder) { 
        deltaX *= -1; 
       } 
       if (atBottomBorder || atTopBorder) { 
        deltaY *= -1; 
       } 
      } 
     })); 

     loop.setCycleCount(Timeline.INDEFINITE); 
     loop.play(); 

    } 

    public static void main(final String[] args) { 
     launch(args); 
    } 
} 
+0

我明白了。非常感謝。 – IPO