JavaFX - 圆和矩形之间的交互

时间:2015-05-27 17:27:53

标签: java javafx

我想知道当矩形与圆圈折叠时我如何进行交互。就像圆形和矩形坍塌时发生的某种动作一样。还有一个问题是圆圈可以超出框架,我不知道如何限制它的运动。我甚至不确定是否可以按照我想要的方式做到这一点。这应该是一个我需要躲避所有矩形的游戏,这是我能做的最好的。谢谢它提前:)

       public class Java2 extends Application {

       public static final int KRUG_WIDTH = 10; 
       public static final int PANEL_WIDTH = 600;
       public static final int PANEL_HEIGHT = 600;

       private int mX = (PANEL_WIDTH - KRUG_WIDTH) / 2;
       private int mY = (PANEL_HEIGHT - KRUG_WIDTH) / 2;
       Random ran = new Random();

        @Override
        public void start(Stage primaryStage) {




            Rectangle rekt = new Rectangle(20, 20);
            Rectangle rekt1 = new Rectangle(20, 20);


            Circle r1 = new Circle(mX,mY,KRUG_WIDTH);  

            Pane root = new Pane(); //PANE

            r1.setFill(Color.WHITE);
            r1.setStroke(Color.BLACK);

            root.getChildren().add(r1);
            root.getChildren().add(rekt);
            root.getChildren().add(rekt1);

            Scene scene = new Scene(root, PANEL_WIDTH, PANEL_HEIGHT);





    PathTransition pathTransition = new PathTransition();
    Path path = new Path();



    //REKT-PATH
    pathTransition.setDuration(javafx.util.Duration.millis(600));
    pathTransition.setPath(path);
    pathTransition.setNode(rekt);
    pathTransition.setOrientation(PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
    pathTransition.setCycleCount(2);
    pathTransition.setAutoReverse(true);
            pathTransition.setOnFinished(e -> {

                pathTransition.setPath(createPath());
                pathTransition.play();

            });
    pathTransition.play();




    PathTransition pathTransition1 = new PathTransition();
    Path path1 = new Path();



    //REKT1-PATH
    pathTransition1.setDuration(javafx.util.Duration.millis(550));
    pathTransition1.setPath(path1);
    pathTransition1.setNode(rekt1);
    pathTransition1.setOrientation(
PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
    pathTransition1.setCycleCount(Timeline.INDEFINITE);
    pathTransition1.setAutoReverse(true);
            pathTransition1.setOnFinished(e -> {

                pathTransition1.setPath(createPath());
                pathTransition1.play();

            });
    pathTransition1.play();





    r1.setOnKeyPressed(e -> {
               switch (e.getCode()) {
                     case DOWN: r1.setCenterY(r1.getCenterY()+ 10);
                            break;
                     case UP: r1.setCenterY(r1.getCenterY()- 10);
                            break;
                     case LEFT: r1.setCenterX(r1.getCenterX() - 10);
                            break;
                     case RIGHT: r1.setCenterX(r1.getCenterX() + 10);
                            break;
                     case SPACE: 
                         break;

                     default:

               }
             });




            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
            r1.requestFocus();
        }


    private Path createPath() {
            int loc2 = ran.nextInt(600 - 300 + 1) + 300;
            int loc = ran.nextInt(600 - 20 + 1) + 20; 

            Path path = new Path();

            path.getElements().add(new MoveTo(20, 20));
            path.getElements().add(new LineTo(loc, loc2));

            return path;

        }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }

    }

1 个答案:

答案 0 :(得分:1)

你的方法不是我要采取的方法。通常你有一个计时器作为游戏循环,其中所有的魔法正在发生,我。即移动精灵,检查碰撞,更新UI中的精灵。在JavaFX中,这将是AnimationTimer

在您的代码中,您会错过几个重要的事情,其中​​包括键盘或鼠标输入。或者你如何检查碰撞。有e。 G。节点的intersects方法,但只检查节点的矩形边界。然而,你有一个圆圈,这使事情变得更复杂。但是,如果性能不是游戏的问题,您可以使用Shape's intersect method从Rectangle和Circle创建一个新形状,并根据结果决定是否发生碰撞。

前段时间我创建了关于how to move sprites on the screen的示例代码,并检查它们是否与其他人发生冲突。

关于弹出该代码中的场景边界,您只需检查场景边界并将移动增量更改为弹跳值,即。即如果精灵从左向右移动(dx为正)并且在右侧,则将delta dx设置为负值,使其向相反方向移动。

您还可以查看使用该引擎的略微修改版本的simple Pong game

与代码形状交叉的示例:

Shape shape = Shape.intersect(rekt, r1);
boolean intersects = shape.getBoundsInLocal().getWidth() != -1; 
if( intersects) {
  System.out.println( "Collision");
}   

仅此一点就提出了你要把支票放在哪里的问题。通常情况下,你必须在任何动作时执行它,i。即在这两个路径转换中

pathTransition.currentTimeProperty().addListener( e -> {
...
});

并在圈内过渡。这将是2次检查太多。