JavaFX rilevamento collisione con il palco


Ho creato un programma che crea un piccolo cerchio nero sullo schermo che è mobile utilizzando W A S D tasti della tastiera. Ora sto cercando di fare in modo che il cerchio nero non vada fuori dai limiti del palco ( cosa che attualmente fa ). La mia idea è di creare un metodo che prende 2 argomenti: circle e the stage. Il metodo funzionerebbe in questo modo:

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

Questo metodo dovrebbe verificare se il cerchio interessa il palco, se lo fa, allora imposterà la velocità di movimento delle palle su zero, impedendogli così di passare attraverso il palco. Tuttavia, il

circle.getBoundsInParent().intersects(stage)) 
Il codice

Non funziona. Dice che lo stadio non può essere convertito in limiti. Cosa devo fare per verificare la collisione di figure e stadi e impedire alla figura di uscire dai legami di fase?

Questo è il mio codice attuale.

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

Ci sono diversi modi per farlo. Sento che questo sarebbe optare per la tua situazione.

Si utilizzano le proprietà centerX e centerY del cerchio per lo spostamento del cerchio. Queste proprietà restituiscono la posizione del centro del cerchio e possiamo usare lo stesso per il rilevamento delle collisioni. La posizione del punto esatto sulla circonferenza del cerchio che si intersecherà con il bordo della scena sarà la somma di questo valore e il raggio del cerchio.

Possiamo sempre ottenere il riferimento alla scena (node.getScene()) e quindi trovare i limiti in cui il cerchio è permesso di viaggiare. Nel tuo caso, abbiamo già il riferimento alla scena, quindi lo usiamo.

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