2017-12-04 1 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); 

    } 
} 
관련 문제