Как можно ограничить поле для движения Game unit заранее?

Как можно ограничить поле для движения Game unit заранее?

import javafx.scene.shape.Rectangle;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.event.EventHandler;
import javafx.concurrent.Task;
import javafx.geometry.Side;




public class GameUnit extends Rectangle implements EventHandler<KeyEvent> {
    private double x = getX();
    private double y = getY();
    public int i;
    private Zlodey zlodey;
    private Zlodeytwo zlodeytwo;
    private Zlodeytre zlodeytre;

    private Boss boss;

    public GameUnit(double x, double y, double width, double height) {
        super(x, y, width, height);
        setFill(Color.BLACK);
    }
    public int speed_o = 10;
    public int speed_b = 11;

   

    public void setBoss(Boss boss){this.boss = boss;}
    public void setZlodey(Zlodey zlodey) {
        this.zlodey = zlodey;
    }
    public void setZlodeytwo(Zlodeytwo zlodeytwo) {
        this.zlodeytwo = zlodeytwo;
    }
    public void setZlodeytre(Zlodeytre zlodeytre) {
        this.zlodeytre = zlodeytre;
    }

    private void updateZlodeyPositiontwo() throws Exception  {
        if (zlodeytwo != null) {
            double dx = getX() - zlodeytwo.getX();
            double dy = getY() - zlodeytwo.getY();
            double dist = Math.sqrt(dx * dx + dy * dy);
            if (dist > 0) {
                dx /= dist;
                dy /= dist;
                zlodeytwo.setX(zlodeytwo.getX() + dx * speed_o + i);
                zlodeytwo.setY(zlodeytwo.getY() + dy * speed_o + i);
                if (dist < 15) {
                    behavior = null;
                }

            }

        }
    }








    private void updateZlodeyPosition() {
        if (zlodey != null) {
            double dx = getX() - zlodey.getX();
            double dy = getY() - zlodey.getY();
            double dist = Math.sqrt(dx * dx + dy * dy);
            if (dist > 0) {
                dx /= dist;
                dy /= dist;
                zlodey.setX(zlodey.getX() + dx * speed_o);
                zlodey.setY(zlodey.getY() + dy * speed_o);
                if (dist < 15) {
                    behavior = null;
                }

            }
        }
    }

    private void updateZlodeyPositiontre() {
        if (zlodeytre != null) {
            double dx = getX() - zlodeytre.getX();
            double dy = getY() - zlodeytre.getY();
            double dist = Math.sqrt(dx * dx + dy * dy);
            if (dist > 0) {
                dx /= dist;
                dy /= dist;
                zlodeytre.setX(zlodeytre.getX() + dx * speed_o);
                zlodeytre.setY(zlodeytre.getY() + dy * speed_o);
                if (dist < 15) {
                    behavior = null;
                }

            }
        }
    }
    private void updateBoss() {
        if (boss != null) {
            double dx = getX() - boss.getX();
            double dy = getY() - boss.getY();
            double dist = Math.sqrt(dx * dx + dy * dy);
            if (dist > 0) {
                dx /= dist;
                dy /= dist;
                boss.setX(boss.getX() + dx * speed_b);
                boss.setY(boss.getY() + dy * speed_b);
                if (dist < 30) {
                    behavior = null;
                }

            }
        }
    }






    private void checkInitBehavior() {
        if ( behavior == null ) {
            behavior = new GameUnitBehavior();
            new Thread(behavior).start();

        }
    }


    private GameUnitBehavior behavior;






    @Override
    public void handle(KeyEvent event) {
        checkInitBehavior();
        switch (event.getCode()) {
            case LEFT:
                behavior.moveToSide(Side.LEFT);
                break;
            case RIGHT:
                behavior.moveToSide(Side.RIGHT);
                break;
            case UP:
                behavior.moveToSide(Side.TOP);
                break;
            case DOWN:
                behavior.moveToSide(Side.BOTTOM);
                break;


        }
    }

    private class GameUnitBehavior extends Task {

        private boolean vertical = false;

        private boolean positiv =  true;

        private double step = 10.0;


        @Override
        protected Object call() throws Exception {
            while (behavior != null) {
                updateZlodeyPosition();
                updateZlodeyPositiontwo();
                updateZlodeyPositiontre();
                updateBoss();
                if ( vertical ) {

                    setX(getX() + (positiv ? step : -step));
                } else {

                    setY(getY() + (positiv ? step : -step));
                }
               Thread.sleep(100);
            }
            return behavior;
         }

        public void moveToSide(Side side) {

            vertical = side.isVertical();
            positiv  = side == (vertical ? Side.RIGHT : Side.BOTTOM );
        }
    }
}

///

import javafx.application.Application;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;



public class Game extends Application {

    protected int width = 800;
    protected int heigh = 800;
    @Override
    public void start(Stage primaryStage) throws Exception {


        GameUnit gameUnit = new GameUnit(150, 60, 10, 10);
        Zlodey zl = new Zlodey(40, 50, 10,10);
        Zlodeytwo zlt = new Zlodeytwo(700, 50, 20,20);
        Zlodeytre zltr = new Zlodeytre(150, 700, 5,5);
        Boss boss = new Boss(400,700,50,50);

        gameUnit.setZlodey(zl);
        gameUnit.setZlodeytwo(zlt);
        gameUnit.setZlodeytre(zltr);
        gameUnit.setBoss(boss);
        Scene scene = new Scene(new Pane(gameUnit, zl, zlt ,zltr,boss), width, heigh  );
        scene.setFill(Color.WHITE);

        scene.setOnKeyPressed(gameUnit);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


}

///вот один из примеров класса zlodey

import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;


public class Zlodey  extends Rectangle  {
    private double x;
    private double y;


    public Zlodey(double x, double y, double width, double height) {
        super(x, y, width, height);
        setFill(Color.RED);


    }

    protected Object call() throws Exception {
        while (getScene().getWindow().isShowing()) {

            setLayoutX(super.getX() +  x);

            setLayoutY(super.getY() +  y);
        }
            Thread.sleep(100);
        return null;
    }




}

Ответы (0 шт):