JavaFX détection de collision avec la scène


J'ai créé un programme qui crée un petit cercle noir sur l'écran qui est mobile à l'aide des touches du clavier W A S D. Maintenant, j'essaie de faire en sorte que le cercle noir ne sorte pas des limites de la scène ( ce qu'il fait actuellement ). Mon idée est de créer une méthode qui prend 2 arguments: le cercle et la scène. La méthode fonctionnerait comme ceci:

if(circle.getBoundsInParent().intersects(stage)) { 
     MOVEMENT_SPEED = 0 
} 

Cette méthode est censée vérifier si le cercle intéresse la scène, si c'est le cas, alors elle réglera la vitesse de déplacement des balles sur zéro, l'empêchant ainsi de passer par la scène. Cependant, le

circle.getBoundsInParent().intersects(stage)) 

Le code ne fonctionne pas. Il dit que la scène ne peut pas être convertie en limites. Que dois-je faire pour vérifier la collision entre la figure et la scène et empêcher la figure de sortir des liaisons de scène?

C'est mon code actuel.

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;
    }   */
 }    
}
Author: ItachiUchiha, 2015-10-11

1 answers

Il y a plusieurs façons de le faire. Je pense que ce serait opter pour votre situation.

Vous utilisez les propriétés centerX et centerY du cercle pour le mouvement du cercle. Ces propriétés renvoient la position du centre du cercle et nous pouvons utiliser la même chose pour la détection de collision. La position exacte du point sur la circonférence du cercle qui se coupent avec le bord de la scène sera la somme de cette valeur et le rayon du cercle.

, Nous pouvons toujours obtenir la référence à la scène (node.getScene()) et donc trouver les limites où le cercle est autorisé à voyager. Dans votre cas, nous avons déjà la référence à la scène, donc nous avons juste l'utiliser.

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;
    }
}
 0
Author: ItachiUchiha, 2015-10-11 09:02:27