2015-05-27 16 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

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

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

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

关于在该代码中跳出场景边界,只需检查场景边界并将运动增量更改为弹跳值即i。即如果精灵从左向右移动(dx为正)并且位于右侧,则将delta 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 -> { 
... 
}); 

和在圆形过渡。这将是2检查太多。

+0

谢谢你解释得很好的答案,我会检查动画计时器,我会检查那个乒乓球游戏。这可能会帮助我很多。 –