2013-11-16 5 views
4

Я новичок в Javafx, и я создаю простую программу. То, что я пытаюсь достичь, это заставить мяч отскакивать от стен, но я еще не понял, как это сделать. Кроме того, не стесняйтесь оставлять другие предложения о моем коде.Как заставить мяч отскакивать от стен в JavaFX?

Вот исходный код:

public class GamePractice extends Application { 

    public static Circle circle; 
    public static Pane canvas; 
    private long counter = 0; 

    @Override 
    public void start(Stage primaryStage) { 

     canvas = new Pane(); 
     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); 


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

      @Override 
      public void handle(ActionEvent t) { 
       if (counter++ % 10 == 0) 
       { 
        circle.setLayoutX(circle.getLayoutX() + 10); 
        circle.setLayoutY(circle.getLayoutY() + 10); 


        //This is what I currently have, am I headed the right direction? 
        //Check X and Y for collision with the ball 
        if ((circle.getTranslateX() == canvas.getWidth() - 10) || (circle.getTranslateY() == canvas.getHeight() - 10)) { 
         //How do I make the ball bounce? 
        } 

       } 
      } 

     })); 

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

Я ценю помощь.

+1

Вместо добавления 10, вычесть 10? Конечно, вам понадобится логическая переменная, чтобы определить, должен ли шар двигаться влево или вправо (изменился бы один раз, когда он попадет на одну из стен). Например, если он попадает в левую стену, установите «movingRight = true» и когда он попадает в правую стену, установите 'movingRight = false'. –

+0

Спасибо большое Джош! – Gregg1989

+0

Я собираюсь написать действительно простой пример этого, но не в JavaFX, так что вы можете увидеть, как вы можете это сделать. И тогда вы могли бы взять некоторые идеи от него и использовать его в своей. –

ответ

6

Подсказка: вы должны avoid comparing double values for exact equalitya == b.

С некоторыми небольшими изменениями кода вы уже там:

package learn.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.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 = 3; 
      double deltaY = 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

Спасибо! Это решило мою проблему – Gregg1989

 Смежные вопросы

  • Нет связанных вопросов^_^