Как я могу сохранить движущийся объект в области окна javafx? - PullRequest
0 голосов
/ 13 марта 2020

Я хочу переместить изображение (курица 80 на 80), но оно не должно покидать панель. Панель 700 на 700.

Я исправил, что она не может уйти, когда сталкивается с боковой частью панели, но в углу она убегает.

Как это исправить?

public class Main extends Application {
    private static final int KEYBOARD_MOVEMENT_DELTA = 5;

    @Override
    public void start(Stage stage) throws Exception {
        Pane pane = new Pane();
        pane.setStyle("-fx-background-color: green;");
        pane.setPrefSize(700,700);

        Rectangle rect = createRectangle();
        ImageView chicken = createChicken();

        pane.getChildren().addAll(rect, chicken);
        Scene scene = new Scene(pane, Color.GREEN);

        moveChickenOnKeyPress(scene, chicken);
        stage.setTitle("Happy chicken");
        stage.setScene(scene);
        stage.show();
    }

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

    private void moveChickenOnKeyPress(Scene scene, final ImageView chicken) {
        scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override public void handle(KeyEvent event) {
                switch (event.getCode()) {
                    // Checks if the chicken can do the movement while staying in frame
                    case UP:
                        if (!isInGreenBoxSides(chicken).equals("up") && !cornerCheck(chicken).equals("up")) {
                            chicken.setY(chicken.getY() - KEYBOARD_MOVEMENT_DELTA);
                        } break;
                    case RIGHT:
                        if (!isInGreenBoxSides(chicken).equals("right") && !cornerCheck(chicken).equals("right")) {
                            chicken.setX(chicken.getX() + KEYBOARD_MOVEMENT_DELTA);
                        } break;
                    case DOWN:
                        if (!isInGreenBoxSides(chicken).equals("down") && !cornerCheck(chicken).equals("down")) {
                            chicken.setY(chicken.getY() + KEYBOARD_MOVEMENT_DELTA);
                        } break;
                    case LEFT:
                        if (!isInGreenBoxSides(chicken).equals("left") && !cornerCheck(chicken).equals("left")) {
                            chicken.setX(chicken.getX() - KEYBOARD_MOVEMENT_DELTA);
                        } break;
                } }});
    }

    private ImageView createChicken() throws FileNotFoundException {
        Image image = new Image(new FileInputStream("./img/chicken.png"));
        ImageView imageView = new ImageView(image);
        imageView.setFitHeight(80);
        imageView.setFitWidth(80);
        return imageView;
    }

    private Rectangle createRectangle() {
        Rectangle rect = new Rectangle(160, 220, 250, 250);
        rect.setFill(Color.SADDLEBROWN);
        return rect;
    }

    private String isInGreenBoxSides(ImageView imageView){
        double y = imageView.getY();
        double x = imageView.getX();

        if ( x <= 0) {
            return "left";
        }else if ( (y) <= 0) {
            return "up";
        }else if ( (x + imageView.getFitHeight()) > 700) {
            return "right";
        }else if ( (y + imageView.getFitHeight()) >= 700) {
            return "down";
        } else{
            return "";
        }
    }

    private String isInGreenBoxCorners(ImageView imageView){
        double y = imageView.getY();
        double x = imageView.getX();
        double width = imageView.getFitWidth();
        double height = imageView.getFitHeight();

        if ((x + width) <= 0 && y <= 0) {
            return "leftUp";
        }else if ( (x + width) >= 700 && y <= 0) {
            return "rightUp";
        }else if ( (x + width) >= 700 && (y + height) >= 700) {
            return "rightDown";
        }else if ( x >= 700 && (y + height) >= 700) {
            return "leftDown";
        } else{
            return "";
        }
    }

    private String cornerCheck (ImageView obj){
        if (isInGreenBoxCorners(obj).equals("leftUp") || isInGreenBoxCorners(obj).equals("leftDown")){
            return "left";
        }else if (isInGreenBoxCorners(obj).equals("rightUp") || isInGreenBoxCorners(obj).equals("rightDown")){
            return "right";
        }else if (isInGreenBoxCorners(obj).equals("leftUp") || isInGreenBoxCorners(obj).equals("rightUp")) {
            return "up";
        }else if (isInGreenBoxCorners(obj).equals("leftDown") || isInGreenBoxCorners(obj).equals("rightDown")) {
            return "down";
        }else {
            return "none";
        }
    }
}

Существуют ли более умные способы сохранить объект внутри панели в Javafx? Кажется, я не могу найти решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...