我创建了一个程序,在屏幕上创建一个可以使用W A S D键盘键移动的小黑圈。现在我试图让黑色圆圈不会超出舞台边界(它目前正在进行)。我的想法是创建一个带有2个参数的方法:circle和stage。该方法可以这样工作:
if(circle.getBoundsInParent().intersects(stage)) {
MOVEMENT_SPEED = 0
}
这个方法应该检查圆圈是否与舞台相互作用,如果是,那么它会将球的移动速度设置为零,从而阻止他通过舞台。但是,
circle.getBoundsInParent().intersects(stage))
代码不起作用。它说舞台不能转换为界限。我需要做些什么来检查数字和阶段碰撞并防止数字移出Stage债券?
这是我目前的代码。
package pong;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class Main extends Application {
private static int MOVEMENT_SPEED = 10;
@Override
public void start(Stage primaryStage) {
final Circle circle = createCircle();
final Group group = new Group( circle);
Scene scene = new Scene(group, 700, 700);
move(scene, circle);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private void move(Scene scene, final Circle circle) {
scene.setOnKeyPressed((KeyEvent event) -> {
switch (event.getCode()) {
case W: circle.setCenterY(circle.getCenterY() - MOVEMENT_SPEED);
break;
case D: circle.setCenterX(circle.getCenterX() + MOVEMENT_SPEED);
break;
case S: circle.setCenterY(circle.getCenterY() + MOVEMENT_SPEED);
break;
case A: circle.setCenterX(circle.getCenterX() - MOVEMENT_SPEED);
break;
}
});
}
private Circle createCircle() {
final Circle circle = new Circle(10, 10, 10, Color.BLACK);
circle.setOpacity(0.7);
return circle;
}
// This method should detect collision and prevent it from happening
private void detectCollsion(Circle circle, Stage primaryStage) {
/* if(circle.getBoundsInParent().intersects(primaryStage)) {
MOVEMENT_SPEED = 0;
} */
}
}
答案 0 :(得分:0)
有多种方法可以做到这一点。我觉得这会选择你的情况。
您正在使用圈子的centerX
和centerY
属性来移动圆圈。这些属性返回圆心的位置,我们可以使用相同的方法进行碰撞检测。与圆圈边缘相交的圆周上的精确点的位置将是该值与圆的半径之和。
我们总是可以获得对场景的引用(node.getScene()
),因此可以找到允许圈子行进的界限。在你的情况下,我们已经有了对场景的引用,所以我们只是使用它。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class Main extends Application{
private static int MOVEMENT_SPEED = 10;
private static int RADIUS = 10;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
final Circle circle = createCircle();
final Group group = new Group( circle);
Scene scene = new Scene(group, 700, 700);
move(scene, circle);
primaryStage.setScene(scene);
primaryStage.show();
}
private void move(Scene scene, final Circle circle) {
scene.setOnKeyPressed((KeyEvent event) -> {
switch (event.getCode()) {
case W:
if(circle.getCenterY() > RADIUS)
circle.setCenterY(circle.getCenterY() - MOVEMENT_SPEED);
break;
case D:
if(circle.getCenterX() < scene.getWidth() - RADIUS)
circle.setCenterX(circle.getCenterX() + MOVEMENT_SPEED);
break;
case S:
if(circle.getCenterY() < scene.getHeight() - RADIUS)
circle.setCenterY(circle.getCenterY() + MOVEMENT_SPEED);
break;
case A:
if(circle.getCenterX() > RADIUS)
circle.setCenterX(circle.getCenterX() - MOVEMENT_SPEED);
break;
}
});
}
private Circle createCircle() {
final Circle circle = new Circle(10, 10, RADIUS, Color.BLACK);
circle.setOpacity(0.7);
return circle;
}
}