当前位置: 首页 > 面试题库 >

如何在JavaFX中使球从墙壁弹起?

卫浩瀚
2023-03-14
问题内容

我是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();
    }

感谢您的帮助。


问题答案:

一个提示:您应该避免比较双精度值的完全相等 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<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);
    }
}


 类似资料:
  • 我想问题是我标记的地方。它在这里: 但我不知道为什么。我的理论是:球向上移动,击中了顶墙,踢进,使=真,那么和相应地改变(如果击中了顶墙,应该保持不变,而应该乘以-1)。然后它会向下移动,因此从顶墙上“弹”出来。 注意:目前我只工作的顶部墙壁。其他三个等我能想出怎么先从顶墙上弹开的时候再做。 你能帮我看看有什么问题吗?而如果这种操作需要使用vector2类,你能给我解释一下,或者给我一个学习的地方

  • 我正在创建一个Javascript突破游戏,但有一个问题是如何将球保持在墙边界内。 在运行程序时,桨工作正常,在窗口中间创建了一个静态球。直到我设置代码以将球保持在墙壁边界(顶部、左侧和右侧)内,此时,发生了错误,整个程序停止工作。 我尝试了几种if/else变体来修复它,但无法找出代码不起作用的原因。JavaScript代码如下: 非常感谢你的帮助。谢谢!

  • 我有许多带有Lombok注释的类。 有没有办法将Getter、Setter、SuperBuilder、noargsconstuctor、allargsconstuctor、equals和hashcode注释挤压到任何一个可重用组件上? 我试图创建自定义注释 但Lombok注释仅在类、枚举或字段类型上受支持。

  • 我正在看Android的新ARCore库。它有检测水平表面的方法,但没有检测垂直表面或墙壁的方法。 我实际上试图使示例应用程序检测墙壁,但我有很多问题。 在ARCore中是否有一种本机或非本机检测垂直表面的方法?

  • 我已经尝试解决了平滑的玩家-墙壁碰撞的问题,这样玩家可以沿着墙壁滑动。 我尝试了以下内容: 但是如果玩家碰到了墙,他不会滑动...他只是停下来了。(我对W,A,S,D也是分开做的。) 只有当我将玩家位置设置回他正在触摸的墙壁位置时,它才有效。如下: 但是它不起作用,因为对于与另一面墙相连的墙,玩家会接触更多的边,玩家会跳到角落...所以它只适用于一面墙... 我的问题是:如何以另一种方式使玩家与墙

  • 所以我目前正在尝试做一个几乎像迷宫一样的游戏。问题是墙壁碰撞,一旦角色撞到墙上,我就不能再把他弄出来了,不管碰撞后我试图带他去哪个方向,他都会被“卡住”。我想的一个解决方案是,每当角色撞到墙上时,“支持他”,这样就不会再检测到碰撞。然而,当我这样做的时候,他以一种奇怪的方式穿墙。这是我的代码,所以你们可以知道我在做什么: 这段代码的很大一部分实际上是从另一个问同样问题的人那里得到的。即使按照另一个