Как можно ограничить поле для движения 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;
}
}