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