2015-05-27 1 views
1

Я хочу знать, как я могу взаимодействовать, когда прямоугольник обрушивается на круг. Как какое-то действие, которое происходит, когда кружок и прямоугольник рушится. Существует также проблема, что круг может выйти из кадра, и я не знаю, как ограничить его движение. Я даже не уверен, что можно сделать то, что я хочу таким образом. Это должна быть игра, в которой мне нужно уклониться от всех прямоугольников, и это лучшее, что я мог сделать. Спасибо заранее :)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

Ваш подход не тот, который я бы взял. Обычно у вас есть таймер, как игровой цикл, в котором происходит вся магия, т.е. е. перемещать спрайты, проверять столкновение, обновлять спрайты в пользовательском интерфейсе. В JavaFX это будет AnimationTimer.

В вашем коде вы пропустите несколько важных вещей, в том числе клавиатуру или мышь. Или как вы проверяете столкновение. Существует e. г. метод intersects для узлов, но он проверяет только прямоугольные границы узла. Однако у вас есть круг, который усложняет ситуацию. Однако, если производительность не является проблемой для вашей игры, вы можете использовать Shape's intersect method для создания новой фигуры из Rectangle и Circle, и в зависимости от результата решаете, есть ли у вас столкновение или нет.

Некоторое время назад я создал примерный код около how to move sprites on the screen и проверить, столкнулись ли они с другими.

Что касается отскока от границ сцены в этом коде, вы просто проверяете границы сцены и изменяете дельту движения на значение перескакивания, т.е. е. если спрайт перемещается слева направо (dx положителен) и находится справа, вы устанавливаете дельта dx на отрицательное значение, чтобы он двигался в противоположном направлении.

Вы также можете взглянуть на simple Pong game, который использует слегка измененную версию этого двигателя.


Пример формы пересечения с вашим кодом:

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

Это само по себе возникает вопрос, где вы бы поставить чек. Обычно вам придется выполнять его, когда что-либо движется, т.е. е. в обоих переходах пути, подобных этому

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

и в круге перехода. Это было бы слишком много чеков.

+0

Спасибо за ваш хорошо объясненный ответ, я проверю таймер анимации, и я проверю эту игру в пинг-понг. Это, вероятно, поможет мне много. –

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