如何让球在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() { @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(); } 

我很感激帮助。

一个提示:你应该避免比较精确相等 a == b 双重值 a == 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() { 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); } }