2017-12-04 2 views
2

私は衝突の検出と動きを理解するために取り組んでおり、動きが正しく落ちている問題があります。私の目標は、プレーヤーが四角形の周りを移動できるようにすることですが、四角形を通過させることはできません。私の問題は、プレーヤーが長方形の境界に達すると、彼らはバックアップすることができないということです。どんな助けでも大歓迎です。矩形の円の動きの衝突

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import static javafx.scene.input.KeyCode.DOWN; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.Circle; 

public class CircleMovement extends Application { 

    //create the panes to handle the game 
    BorderPane mainPane = new BorderPane(); 
    GridPane infoPane = new GridPane(); 
    Pane gameField = new Pane(); 
    Scene scene; 
    //create circle/movement properties 
    double increment = 5.0; 
    double radius = 10; 
    double x = radius, y = radius; 
    //create Rectangle properties 
    double Rwidth = 80; 
    double Rheight = 20; 
    //create player and objects 
    Circle player = new Circle(x, y, radius); 
    Rectangle r1 = new Rectangle(0, 100, Rwidth, Rheight);//Rectangle(int x, int y, int width, int height) 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     setPanes(); 
     gameField.getChildren().addAll(r1, player); 
     moveCircleOnKeyPress(scene, player);//pass to player movement method 

     //set the stage 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public void moveCircleOnKeyPress(Scene scene, Circle player) {//player movement 
     scene.setOnKeyPressed((KeyEvent event) -> { 
      switch (event.getCode()) { 
       case UP: 
        player.setCenterY(player.getCenterY() - increment);//move player 
        if (player.getBoundsInLocal().intersects(r1.getBoundsInLocal())) { 
         player.centerYProperty().setValue(r1.getY()); 
        } 
        break; 
       case RIGHT: 
        player.setCenterX(player.getCenterX() + increment); 
        if (player.getBoundsInLocal().intersects(r1.getBoundsInLocal())) { 
         player.centerYProperty().setValue(r1.getY()); 
        } 
        break; 
       case DOWN: 
        player.setCenterY(player.getCenterY() + increment); 
        if (player.getBoundsInLocal().intersects(r1.getBoundsInLocal())) { 
         player.centerYProperty().setValue(r1.getY()); 
        } 
        break; 
       case LEFT: 
        player.setCenterX(player.getCenterX() - increment); 
        if (player.getBoundsInLocal().intersects(r1.getBoundsInLocal())) { 
         player.centerYProperty().setValue(r1.getY()); 
        } 
        break; 
      } 
     }); 
    } 

    public void setPanes() { 
     infoPane.setMaxSize(200, 200); 
     mainPane.setMaxSize(800, 800); 
     mainPane.setCenter(gameField);//place the main game inside the center 
     mainPane.setRight(infoPane); 
     mainPane.setPadding(new Insets(10, 10, 10, 10)); 
     mainPane.setStyle("-fx-border-color: red"); 
     gameField.setStyle("-fx-background-color: white"); 
     gameField.setStyle("-fx-border-color: black"); 
     gameField.setMaxSize(600, 600); 
     scene = new Scene(mainPane, 800, 800); 
     player.setFill(Color.RED); 

    } 
} 

答えて

2

あなたがShapeを使用しているので、それは交差点を検出するために、Shape.intersect(player, r1).getBoundsInLocal().getWidth() != -1を使用することをお勧めします。また、player.centerYProperty().setValue(...);を使用する代わりに、player.setCenterY(...)を使用してください。あなたにはもう少し問題がありましたが、最も重要なのは、交差点が検出されたら何をすべきかという考え方です。交差点が検出されると、検出の直前の距離に戻るべきです(十分な小さなステップで移動している場合のみ)。

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import static javafx.scene.input.KeyCode.DOWN; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.Shape; 
import javafx.stage.Stage; 

public class CircleMovement extends Application 
{ 

    //create the panes to handle the game 
    BorderPane mainPane = new BorderPane(); 
    GridPane infoPane = new GridPane(); 
    Pane gameField = new Pane(); 
    Scene scene; 
    //create circle/movement properties 
    double increment = 5.0; 
    double radius = 10; 
    double x = radius, y = radius; 
    //create Rectangle properties 
    double Rwidth = 80; 
    double Rheight = 20; 
    //create player and objects 
    Circle player = new Circle(x, y, radius); 
    Rectangle r1 = new Rectangle(0, 100, Rwidth, Rheight);//Rectangle(int x, int y, int width, int height) 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     setPanes(); 
     gameField.getChildren().addAll(r1, player); 
     moveCircleOnKeyPress(scene, player);//pass to player movement method 

     //set the stage 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public void moveCircleOnKeyPress(Scene scene, Circle player) 
    {//player movement 
     scene.setOnKeyPressed((KeyEvent event) -> 
     { 
      switch (event.getCode()) 
      { 
       case UP: 
        player.setCenterY(player.getCenterY() - increment);//move player 
        //if (player.getBoundsInLocal().intersects(r1.getBoundsInLocal())) 
        if (Shape.intersect(player, r1).getBoundsInLocal().getWidth() != -1) 
        { 
         player.setCenterY(player.getCenterY() + increment); 
        } 
        break; 
       case RIGHT: 
        player.setCenterX(player.getCenterX() + increment); 

        if (Shape.intersect(player, r1).getBoundsInLocal().getWidth() != -1) 
        { 
         player.setCenterX(player.getCenterX() - increment); 
        } 
        break; 
       case DOWN: 
        player.setCenterY(player.getCenterY() + increment); 
        if (Shape.intersect(player, r1).getBoundsInLocal().getWidth() != -1) 
        { 
         player.setCenterY(player.getCenterY() - increment); 
        } 
        break; 
       case LEFT: 
        player.setCenterX(player.getCenterX() - increment); 
        if (Shape.intersect(player, r1).getBoundsInLocal().getWidth() != -1) 
        { 
         player.setCenterX(player.getCenterX() + increment); 
        } 
        break; 
      } 
     }); 
    } 

    public void setPanes() 
    { 
     infoPane.setMaxSize(200, 200); 
     mainPane.setMaxSize(800, 800); 
     mainPane.setCenter(gameField);//place the main game inside the center 
     mainPane.setRight(infoPane); 
     mainPane.setPadding(new Insets(10, 10, 10, 10)); 
     mainPane.setStyle("-fx-border-color: red"); 
     gameField.setStyle("-fx-background-color: white"); 
     gameField.setStyle("-fx-border-color: black"); 
     gameField.setMaxSize(600, 600); 
     scene = new Scene(mainPane, 800, 800); 
     player.setFill(Color.RED); 

    } 
}