Я хочу переместить изображение (курица 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? Кажется, я не могу найти решение.