Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
dee0586664 | |||
9ba224ac0d | |||
177e168498 | |||
1c11f7062c | |||
1ebbf7412c | |||
d7ae1b884c |
@ -69,7 +69,7 @@
|
||||
<!-- Default configuration for running with: mvn clean javafx:run -->
|
||||
<id>default-cli</id>
|
||||
<configuration>
|
||||
<mainClass>com.example.doubledeckerbus/com.example.doubledeckerbus.FormBus
|
||||
<mainClass>com.example.doubledeckerbus/com.example.doubledeckerbus.Form
|
||||
</mainClass>
|
||||
<launcher>app</launcher>
|
||||
<jlinkZipName>app</jlinkZipName>
|
||||
|
@ -0,0 +1,119 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public abstract class AbstractMap {
|
||||
private IDrawingObject _drawingObject = null;
|
||||
protected int[][] _map = null;
|
||||
protected int _width;
|
||||
protected int _height;
|
||||
protected float _size_x;
|
||||
protected float _size_y;
|
||||
protected final Random _random = new Random();
|
||||
protected final int _freeRoad = 0;
|
||||
protected final int _barrier = 1;
|
||||
|
||||
protected GraphicsContext gc;
|
||||
|
||||
public void CreateMap(int width, int height, IDrawingObject drawingObject, GraphicsContext gc)
|
||||
{
|
||||
_width = width;
|
||||
_height = height;
|
||||
_drawingObject = drawingObject;
|
||||
this.gc = gc;
|
||||
GenerateMap();
|
||||
while (!SetObjectOnMap())
|
||||
{
|
||||
GenerateMap();
|
||||
}
|
||||
DrawMapWithObject();
|
||||
}
|
||||
|
||||
private boolean SetObjectOnMap()
|
||||
{
|
||||
if (_drawingObject == null || _map == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int x = _random.nextInt(0, 10);
|
||||
int y = _random.nextInt(0, 10);
|
||||
_drawingObject.SetObject(x, y, _width, _height);
|
||||
return !CheckCollision();
|
||||
}
|
||||
|
||||
private void DrawMapWithObject()
|
||||
{
|
||||
if (_drawingObject == null || _map == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < _map.length; ++i)
|
||||
{
|
||||
for (int j = 0; j < _map[0].length; ++j)
|
||||
{
|
||||
if (_map[i][j] == _freeRoad)
|
||||
{
|
||||
DrawRoadPart(i, j);
|
||||
}
|
||||
else if (_map[i][j] == _barrier)
|
||||
{
|
||||
DrawBarrierPart(i, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
_drawingObject.DrawingObject(gc);
|
||||
}
|
||||
|
||||
public void MoveObject(Direction direction)
|
||||
{
|
||||
_drawingObject.MoveObject(direction);
|
||||
if (CheckCollision()) {
|
||||
switch (direction) {
|
||||
case Left -> _drawingObject.MoveObject(Direction.Right);
|
||||
case Right -> _drawingObject.MoveObject(Direction.Left);
|
||||
case Up -> _drawingObject.MoveObject(Direction.Down);
|
||||
case Down -> _drawingObject.MoveObject(Direction.Up);
|
||||
}
|
||||
|
||||
}
|
||||
DrawMapWithObject();
|
||||
}
|
||||
|
||||
private boolean CheckCollision() {
|
||||
var pos = _drawingObject.GetCurrentPosition();
|
||||
int startX = (int)((pos.Left) / _size_x);
|
||||
int endX = (int)((pos.Right) / _size_x);
|
||||
int startY = (int)((pos.Top) / _size_y);
|
||||
int endY = (int)((pos.Bottom) / _size_y);
|
||||
|
||||
if (startX < 0 || startY < 0 || endX > _map[0].length || endY > _map.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int y = startY; y <= endY + 1; y++)
|
||||
{
|
||||
for (int x = startX; x <= endX + 1; x++)
|
||||
{
|
||||
try {
|
||||
if (_map[x][y] == _barrier)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (ArrayIndexOutOfBoundsException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
protected abstract void GenerateMap();
|
||||
protected abstract void DrawRoadPart(int i, int j);
|
||||
protected abstract void DrawBarrierPart(int i, int j);
|
||||
}
|
@ -5,52 +5,60 @@ import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ChoiceBox;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
|
||||
import static com.example.doubledeckerbus.ControllerMapWithSetBus._mapBusesCollectionGeneric;
|
||||
|
||||
public class ControllerBus {
|
||||
|
||||
private DrawingBus _bus;
|
||||
ObservableList<Integer> countOfDoors = FXCollections.observableArrayList(3, 4, 5);
|
||||
protected DrawingBus _bus;
|
||||
public DrawingBus SelectedBus;
|
||||
protected ObservableList<Integer> countOfDoors = FXCollections.observableArrayList(3, 4, 5);
|
||||
@FXML
|
||||
private Button buttonCreate;
|
||||
protected Button buttonCreate;
|
||||
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
protected Button buttonSelectBus;
|
||||
|
||||
@FXML
|
||||
private Button buttonLeft;
|
||||
protected Button buttonDown;
|
||||
|
||||
@FXML
|
||||
private Button buttonRight;
|
||||
protected Button buttonLeft;
|
||||
|
||||
@FXML
|
||||
private Button buttonUp;
|
||||
protected Button buttonRight;
|
||||
|
||||
@FXML
|
||||
private Canvas canvasBus;
|
||||
protected Button buttonUp;
|
||||
|
||||
@FXML
|
||||
private AnchorPane pictureBoxBus;
|
||||
protected Canvas canvasBus;
|
||||
|
||||
@FXML
|
||||
private Label statusColor;
|
||||
protected AnchorPane pictureBoxBus;
|
||||
|
||||
@FXML
|
||||
private Label statusSpeed;
|
||||
protected Label statusColor;
|
||||
|
||||
@FXML
|
||||
private Label statusWeight;
|
||||
protected Label statusSpeed;
|
||||
|
||||
@FXML
|
||||
private ChoiceBox<Integer> choiceDoors;
|
||||
protected Label statusWeight;
|
||||
|
||||
@FXML
|
||||
protected ChoiceBox<Integer> choiceDoors;
|
||||
|
||||
@FXML
|
||||
void ButtonCreate_Click(ActionEvent event) {
|
||||
@ -58,14 +66,18 @@ public class ControllerBus {
|
||||
pictureBoxBus.heightProperty().addListener(listener);
|
||||
|
||||
Random rnd = new Random();
|
||||
_bus = new DrawingBus();
|
||||
_bus.Init(rnd.nextInt(100, 300), rnd.nextFloat(1000, 2000),
|
||||
Color.rgb(rnd.nextInt(0, 256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), choiceDoors.getValue());
|
||||
_bus = new DrawingBus(rnd.nextInt(100, 300), rnd.nextFloat(1000, 2000),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(0, 256), rnd.nextInt(0, 256)), choiceDoors.getValue());
|
||||
_bus.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100), (int) pictureBoxBus.getWidth(), (int) pictureBoxBus.getHeight());
|
||||
BorderChanged();
|
||||
}
|
||||
|
||||
void SetData() {
|
||||
Random rnd = new Random();
|
||||
_bus.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100), (int) pictureBoxBus.getWidth(), (int) pictureBoxBus.getHeight());
|
||||
statusSpeed.setText("Скорость: %s".formatted(_bus.Bus.Speed));
|
||||
statusWeight.setText("Вес: %s".formatted(_bus.Bus.Weight));
|
||||
statusColor.setText("Цвет: %s".formatted(_bus.Bus.BodyColor));
|
||||
BorderChanged();
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -85,13 +97,15 @@ public class ControllerBus {
|
||||
public void initialize() {
|
||||
choiceDoors.setItems(countOfDoors);
|
||||
choiceDoors.setValue(3);
|
||||
}
|
||||
|
||||
}
|
||||
InvalidationListener listener = o -> BorderChanged();
|
||||
|
||||
private void Draw()
|
||||
{
|
||||
GraphicsContext gc = canvasBus.getGraphicsContext2D();
|
||||
gc.setFill(Color.WHITE);
|
||||
gc.fillRect(0, 0, pictureBoxBus.getWidth(), pictureBoxBus.getHeight());
|
||||
_bus.DrawTransport(gc);
|
||||
}
|
||||
|
||||
@ -102,4 +116,51 @@ public class ControllerBus {
|
||||
Draw();
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonCreateExtra_Click(ActionEvent event) {
|
||||
pictureBoxBus.widthProperty().addListener(listener);
|
||||
pictureBoxBus.heightProperty().addListener(listener);
|
||||
Random rnd = new Random();
|
||||
_bus = new DrawingDDB(rnd.nextInt(300), rnd.nextInt(2000),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
choiceDoors.getValue(),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
rnd.nextBoolean(), rnd.nextBoolean());
|
||||
SetData();
|
||||
BorderChanged();
|
||||
}
|
||||
@FXML
|
||||
private void ButtonSelectBus_Click(ActionEvent event) throws IOException {
|
||||
SelectedBus = _bus;
|
||||
|
||||
if (SelectedBus == null) {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Вы не создали объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
}
|
||||
else {
|
||||
|
||||
DrawingObjectBus bus = new DrawingObjectBus(SelectedBus);
|
||||
|
||||
if (_mapBusesCollectionGeneric.add(bus) != -1) {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Вы создали объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
} else {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Не удалось добавить объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
}
|
||||
}
|
||||
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(Form.class.getResource("FormMapWithSetBus.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load());
|
||||
Form.myStage.setTitle("DoubleDeckerBus");
|
||||
Form.myStage.setScene(scene);
|
||||
Form.myStage.show();
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,179 @@
|
||||
package com.example.doubledeckerbus;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
public class ControllerMapWithSetBus {
|
||||
static MapWithSetBusesGeneric<DrawingObjectBus, AbstractMap> _mapBusesCollectionGeneric;
|
||||
AbstractMap map = new SimpleMap();
|
||||
static String map_name = "Простая карта";
|
||||
protected ObservableList<String> countOfMap = FXCollections.observableArrayList("Простая карта", "Водная карта");
|
||||
|
||||
@FXML
|
||||
private Button buttonAddBus;
|
||||
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
|
||||
@FXML
|
||||
private Button buttonLeft;
|
||||
|
||||
@FXML
|
||||
private Button buttonRemoveCar;
|
||||
|
||||
@FXML
|
||||
private Button buttonRight;
|
||||
|
||||
@FXML
|
||||
private Button buttonShowMap;
|
||||
|
||||
@FXML
|
||||
private Button buttonShowStorage;
|
||||
|
||||
@FXML
|
||||
private Button buttonUp;
|
||||
|
||||
@FXML
|
||||
private Canvas canvasBus;
|
||||
|
||||
@FXML
|
||||
private ChoiceBox<String> comboBoxSelectorMap;
|
||||
|
||||
@FXML
|
||||
private AnchorPane pictureBoxBus;
|
||||
|
||||
@FXML
|
||||
private TextField textBoxPosition;
|
||||
|
||||
@FXML
|
||||
private void initialize(){
|
||||
comboBoxSelectorMap.setItems(countOfMap);
|
||||
comboBoxSelectorMap.setValue(map_name);
|
||||
}
|
||||
|
||||
GraphicsContext gc;
|
||||
private void FirstIncome() {
|
||||
if (_mapBusesCollectionGeneric == null) {
|
||||
_mapBusesCollectionGeneric = new MapWithSetBusesGeneric<DrawingObjectBus, AbstractMap>(
|
||||
(int) pictureBoxBus.getWidth(), (int) pictureBoxBus.getHeight(), map);
|
||||
}
|
||||
gc = canvasBus.getGraphicsContext2D();
|
||||
if (comboBoxSelectorMap.getValue() != map_name) {
|
||||
map_name = comboBoxSelectorMap.getValue();
|
||||
switch (map_name) {
|
||||
case "Простая карта" -> map = new SimpleMap();
|
||||
case "Водная карта" -> map = new WaterMap();
|
||||
}
|
||||
_mapBusesCollectionGeneric.changeMap(map);
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonAddBus_Click(ActionEvent event) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(Form.class.getResource("FormBus.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load());
|
||||
Form.myStage.setTitle("DoubleDeckerBus");
|
||||
Form.myStage.setScene(scene);
|
||||
Form.myStage.show();
|
||||
|
||||
FirstIncome();
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonRemoveBus_Click(ActionEvent event)
|
||||
{
|
||||
FirstIncome();
|
||||
if (Objects.equals(textBoxPosition.getText(), ""))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||
alert.setTitle("RemoveBus");
|
||||
alert.setHeaderText("Вы действительно хотите удалить объект?");
|
||||
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
if (option.get() == ButtonType.CANCEL) {
|
||||
return;
|
||||
}
|
||||
|
||||
int pos;
|
||||
try {
|
||||
pos = Integer.parseInt(textBoxPosition.getText());
|
||||
}
|
||||
catch (Exception e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_mapBusesCollectionGeneric.remove(pos) != null)
|
||||
{
|
||||
alert = new Alert(Alert.AlertType.WARNING);
|
||||
alert.setTitle("RemoveBus");
|
||||
alert.setContentText("Вы удалили объект");
|
||||
option = alert.showAndWait();
|
||||
}
|
||||
else
|
||||
{
|
||||
alert = new Alert(Alert.AlertType.WARNING);
|
||||
alert.setTitle("RemoveBus");
|
||||
alert.setContentText("Не удалось удалить объект");
|
||||
option = alert.showAndWait();
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonShowStorage_Click(ActionEvent event)
|
||||
{
|
||||
FirstIncome();
|
||||
if (_mapBusesCollectionGeneric == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
gc.setFill(Color.WHITE);
|
||||
gc.fillRect(0, 0, pictureBoxBus.getWidth(), pictureBoxBus.getHeight());
|
||||
_mapBusesCollectionGeneric.ShowSet(gc);
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonShowOnMap_Click(ActionEvent event) {
|
||||
FirstIncome();
|
||||
if (_mapBusesCollectionGeneric == null) {
|
||||
return;
|
||||
}
|
||||
gc.setFill(Color.WHITE);
|
||||
gc.fillRect(0, 0, pictureBoxBus.getWidth(), pictureBoxBus.getHeight());
|
||||
_mapBusesCollectionGeneric.ShowOnMap(gc);
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonMove_Click(ActionEvent event)
|
||||
{
|
||||
if (_mapBusesCollectionGeneric == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
String name = ((Button) event.getSource()).getId();
|
||||
Direction dir = Direction.None;
|
||||
switch (name) {
|
||||
case "buttonUp" -> dir = Direction.Up;
|
||||
case "buttonDown" -> dir = Direction.Down;
|
||||
case "buttonLeft" -> dir = Direction.Left;
|
||||
case "buttonRight" -> dir = Direction.Right;
|
||||
}
|
||||
_mapBusesCollectionGeneric.MoveObject(dir);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,165 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.beans.InvalidationListener;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
|
||||
import static com.example.doubledeckerbus.ControllerMapWithSetBus._mapBusesCollectionGeneric;
|
||||
|
||||
public class ControllerPolymorph {
|
||||
protected DrawingBus _bus;
|
||||
protected DrawingPolymorphBus<EntityBus, IDrawingDoors> polymorphBus;
|
||||
public DrawingBus SelectedBus;
|
||||
protected ObservableList<Integer> countOfDoors = FXCollections.observableArrayList(3, 4, 5);
|
||||
|
||||
@FXML
|
||||
protected Button buttonCreate;
|
||||
|
||||
@FXML
|
||||
protected Canvas canvasBus;
|
||||
|
||||
@FXML
|
||||
protected AnchorPane pictureBoxBus;
|
||||
|
||||
@FXML
|
||||
protected Label statusColor;
|
||||
|
||||
@FXML
|
||||
protected Label statusSpeed;
|
||||
|
||||
@FXML
|
||||
protected Label statusWeight;
|
||||
|
||||
@FXML
|
||||
protected ChoiceBox<Integer> choiceDoors;
|
||||
|
||||
@FXML
|
||||
void ButtonCreate_Click(ActionEvent event) {
|
||||
pictureBoxBus.widthProperty().addListener(listener);
|
||||
pictureBoxBus.heightProperty().addListener(listener);
|
||||
|
||||
Random rnd = new Random();
|
||||
IDrawingDoors door = null;
|
||||
switch (rnd.nextInt(3)) {
|
||||
case (0) -> door = new DrawingDoors();
|
||||
case (1) -> door = new DrawingEllipsoidDoors();
|
||||
case (2) -> door = new DrawingTriangleDoors();
|
||||
}
|
||||
door.setCountOfDoors(choiceDoors.getValue());
|
||||
|
||||
EntityBus bus = new EntityBus(rnd.nextInt(300), rnd.nextInt(2000),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
|
||||
polymorphBus.AddDoors(door);
|
||||
polymorphBus.AddEntity(bus);
|
||||
|
||||
_bus = polymorphBus.CreateBus();
|
||||
SetData();
|
||||
BorderChanged();
|
||||
}
|
||||
|
||||
void SetData() {
|
||||
Random rnd = new Random();
|
||||
_bus.SetPosition(rnd.nextInt(10, 100), rnd.nextInt(10, 100), (int) pictureBoxBus.getWidth(), (int) pictureBoxBus.getHeight());
|
||||
statusSpeed.setText("Скорость: %s".formatted(_bus.Bus.Speed));
|
||||
statusWeight.setText("Вес: %s".formatted(_bus.Bus.Weight));
|
||||
statusColor.setText("Цвет: %s".formatted(_bus.Bus.BodyColor));
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
polymorphBus = new DrawingPolymorphBus<>(100, 100);
|
||||
choiceDoors.setItems(countOfDoors);
|
||||
choiceDoors.setValue(3);
|
||||
|
||||
}
|
||||
InvalidationListener listener = o -> BorderChanged();
|
||||
|
||||
private void Draw()
|
||||
{
|
||||
GraphicsContext gc = canvasBus.getGraphicsContext2D();
|
||||
gc.setFill(Color.WHITE);
|
||||
gc.fillRect(0, 0, pictureBoxBus.getWidth(), pictureBoxBus.getHeight());
|
||||
_bus.DrawTransport(gc);
|
||||
}
|
||||
|
||||
void BorderChanged() {
|
||||
canvasBus.setWidth(pictureBoxBus.getWidth());
|
||||
canvasBus.setHeight(pictureBoxBus.getHeight());
|
||||
_bus.ChangeBorders((int) pictureBoxBus.getWidth(), (int) pictureBoxBus.getHeight());
|
||||
Draw();
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ButtonCreateExtra_Click(ActionEvent event) {
|
||||
pictureBoxBus.widthProperty().addListener(listener);
|
||||
pictureBoxBus.heightProperty().addListener(listener);
|
||||
Random rnd = new Random();
|
||||
IDrawingDoors door = null;
|
||||
switch (rnd.nextInt(3)) {
|
||||
case (0) -> door = new DrawingDoors();
|
||||
case (1) -> door = new DrawingEllipsoidDoors();
|
||||
case (2) -> door = new DrawingTriangleDoors();
|
||||
}
|
||||
door.setCountOfDoors(choiceDoors.getValue());
|
||||
|
||||
EntityDDB ddb_bus = new EntityDDB(rnd.nextInt(300), rnd.nextInt(2000),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
rnd.nextBoolean(), rnd.nextBoolean());
|
||||
|
||||
polymorphBus.AddDoors(door);
|
||||
polymorphBus.AddEntity(ddb_bus);
|
||||
|
||||
_bus = polymorphBus.CreateBus();
|
||||
SetData();
|
||||
BorderChanged();
|
||||
}
|
||||
@FXML
|
||||
private void ButtonSelectBus_Click(ActionEvent event) throws IOException {
|
||||
SelectedBus = _bus;
|
||||
|
||||
if (SelectedBus == null) {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Вы не создали объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
}
|
||||
else {
|
||||
|
||||
DrawingObjectBus bus = new DrawingObjectBus(SelectedBus);
|
||||
|
||||
if (_mapBusesCollectionGeneric.add(bus) != -1) {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Вы создали объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
} else {
|
||||
Alert alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("SelectBus");
|
||||
alert.setContentText("Не удалось добавить объект");
|
||||
Optional<ButtonType> option = alert.showAndWait();
|
||||
}
|
||||
}
|
||||
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(Form.class.getResource("FormMapWithSetBus.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load());
|
||||
Form.myStage.setTitle("DoubleDeckerBus");
|
||||
Form.myStage.setScene(scene);
|
||||
Form.myStage.show();
|
||||
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
public enum Direction {
|
||||
None(0),
|
||||
Up(1),
|
||||
Down(2),
|
||||
Left(3),
|
||||
|
@ -3,36 +3,51 @@ package com.example.doubledeckerbus;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class DrawingBus {
|
||||
public EntityBus Bus;
|
||||
|
||||
public DrawingDoors Doors;
|
||||
public IDrawingDoors Doors;
|
||||
|
||||
public EntityBus getBus() {
|
||||
return Bus;
|
||||
}
|
||||
|
||||
private static final int _null = -1000;
|
||||
private float _startPosX;
|
||||
private float _startPosY;
|
||||
protected float _startPosX;
|
||||
protected float _startPosY;
|
||||
private int _pictureWidth;
|
||||
private int _pictureHeight;
|
||||
private static final int _busWidth = 100;
|
||||
private static final int _busHeight = 50;
|
||||
|
||||
public void Init(int speed, float weight, Color bodyColor, int countOfDoors) {
|
||||
Bus = new EntityBus();
|
||||
Bus.Init(speed, weight, bodyColor);
|
||||
Doors = new DrawingDoors();
|
||||
public DrawingBus(int speed, float weight, Color bodyColor, int countOfDoors) {
|
||||
Bus = new EntityBus(speed, weight, bodyColor);
|
||||
switch (new Random().nextInt(3)) {
|
||||
case 0 -> Doors = new DrawingTriangleDoors();
|
||||
case 1 -> Doors = new DrawingDoors();
|
||||
case 2 -> Doors = new DrawingEllipsoidDoors();
|
||||
}
|
||||
Doors.setCountOfDoors(countOfDoors);
|
||||
}
|
||||
|
||||
public DrawingBus(int speed, float weight, Color bodyColor) {
|
||||
Bus = new EntityBus(speed, weight, bodyColor);
|
||||
}
|
||||
|
||||
public DrawingBus(EntityBus bus, IDrawingDoors doors) {
|
||||
Bus = bus;
|
||||
Doors = doors;
|
||||
}
|
||||
|
||||
public void SetPosition(int x, int y, int width, int height) {
|
||||
if (_pictureWidth <= _busWidth || _pictureHeight <= _busHeight) {
|
||||
if (width <= _busWidth || height <= _busHeight) {
|
||||
_pictureWidth = _null;
|
||||
_pictureHeight = _null;
|
||||
return;
|
||||
}
|
||||
|
||||
_startPosX = x;
|
||||
_startPosY = y;
|
||||
_pictureWidth = width;
|
||||
@ -81,7 +96,7 @@ public class DrawingBus {
|
||||
return;
|
||||
}
|
||||
|
||||
gc.clearRect(0, 0, _pictureWidth, _pictureHeight);
|
||||
|
||||
gc.setFill(Bus.BodyColor);
|
||||
gc.fillRect(_startPosX, _startPosY + 10, 100, 30);
|
||||
|
||||
@ -119,4 +134,8 @@ public class DrawingBus {
|
||||
_startPosY = _pictureHeight - _busHeight;
|
||||
}
|
||||
}
|
||||
|
||||
public Position GetCurrentPosition() {
|
||||
return new Position(_startPosX, _startPosX + _busWidth, _startPosY, _startPosY + _busHeight);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,55 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class DrawingDDB extends DrawingBus{
|
||||
public DrawingDDB(int speed, float weight, Color bodyColor, int countOfDoors, Color extraColor, boolean ladder, boolean secondStage) {
|
||||
super(speed, weight, bodyColor, countOfDoors);
|
||||
Bus = new EntityDDB(speed, weight, bodyColor, extraColor, ladder, secondStage);
|
||||
}
|
||||
|
||||
public DrawingDDB(int speed, float weight, Color bodyColor, Color extraColor, boolean ladder, boolean secondStage) {
|
||||
super(speed, weight, bodyColor);
|
||||
Bus = new EntityDDB(speed, weight, bodyColor, extraColor, ladder, secondStage);
|
||||
}
|
||||
|
||||
public DrawingDDB(EntityBus bus, IDrawingDoors doors) {
|
||||
super(bus, doors);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void DrawTransport(GraphicsContext gc)
|
||||
{
|
||||
if (Bus == null) return;
|
||||
|
||||
_startPosY += 30;
|
||||
super.DrawTransport(gc);
|
||||
_startPosY -= 30;
|
||||
EntityDDB ddb = (EntityDDB) Bus;
|
||||
|
||||
gc.setFill(ddb.ExtraColor);
|
||||
if (ddb.SecondStage) {
|
||||
gc.fillRect(_startPosX, _startPosY + 10, 100, 30);
|
||||
gc.setFill(Color.BLACK);
|
||||
gc.fillRect(_startPosX + 30, _startPosY + 20, 10, 20);
|
||||
|
||||
gc.setFill(Color.BLUE);
|
||||
gc.fillOval(_startPosX + 10, _startPosY + 15, 10, 15);
|
||||
gc.fillOval(_startPosX + 50, _startPosY + 15, 10, 15);
|
||||
gc.fillOval(_startPosX + 70, _startPosY + 15, 10, 15);
|
||||
gc.fillOval(_startPosX + 90, _startPosY + 15, 10, 15);
|
||||
}
|
||||
|
||||
if (ddb.Ladder) {
|
||||
gc.strokeLine(_startPosX, _startPosY + 70, _startPosX, _startPosY + 10);
|
||||
gc.strokeLine(_startPosX + 10, _startPosY + 70, _startPosX + 10, _startPosY + 10);
|
||||
|
||||
gc.strokeLine(_startPosX, _startPosY + 20, _startPosX + 10, _startPosY + 20);
|
||||
gc.strokeLine(_startPosX, _startPosY + 30, _startPosX + 10, _startPosY + 30);
|
||||
gc.strokeLine(_startPosX, _startPosY + 40, _startPosX + 10, _startPosY + 40);
|
||||
gc.strokeLine(_startPosX, _startPosY + 50, _startPosX + 10, _startPosY + 50);
|
||||
gc.strokeLine(_startPosX, _startPosY + 60, _startPosX + 10, _startPosY + 60);
|
||||
}
|
||||
}
|
||||
}
|
@ -3,10 +3,11 @@ package com.example.doubledeckerbus;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class DrawingDoors {
|
||||
public class DrawingDoors implements IDrawingDoors {
|
||||
private CountOfDoors _countOfDoors;
|
||||
|
||||
public void DrawDoors(GraphicsContext gc, int _startPosX, int _startPosY) {
|
||||
@Override
|
||||
public void DrawDoors(GraphicsContext gc, float _startPosX, float _startPosY) {
|
||||
gc.setFill(Color.BLACK);
|
||||
gc.fillRect(_startPosX, _startPosY + 20, 10, 20);
|
||||
gc.fillRect(_startPosX + 20, _startPosY + 20, 10, 20);
|
||||
@ -19,13 +20,13 @@ public class DrawingDoors {
|
||||
}
|
||||
}
|
||||
|
||||
public void setCountOfDoors(int number) {
|
||||
@Override
|
||||
public void setCountOfDoors(int count) {
|
||||
for (CountOfDoors item: CountOfDoors.values()) {
|
||||
if (item.getId() == number) {
|
||||
if (item.getId() == count) {
|
||||
_countOfDoors = item;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,33 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class DrawingEllipsoidDoors implements IDrawingDoors{
|
||||
private CountOfDoors _countOfDoors;
|
||||
|
||||
@Override
|
||||
public void DrawDoors(GraphicsContext gc, float _startPosX, float _startPosY) {
|
||||
gc.setFill(Color.GRAY);
|
||||
gc.fillOval(_startPosX, _startPosY + 20, 10, 20);
|
||||
gc.fillOval(_startPosX + 20, _startPosY + 20, 10, 20);
|
||||
gc.fillOval(_startPosX + 40, _startPosY + 20, 10, 20);
|
||||
if (_countOfDoors.getId() >= 4) {
|
||||
gc.fillOval(_startPosX + 60, _startPosY + 20, 10, 20);
|
||||
}
|
||||
if (_countOfDoors.getId() >= 5) {
|
||||
gc.fillOval(_startPosX + 80, _startPosY + 20, 10, 20);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCountOfDoors(int count) {
|
||||
for (CountOfDoors item: CountOfDoors.values()) {
|
||||
if (item.getId() == count) {
|
||||
_countOfDoors = item;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
|
||||
public class DrawingObjectBus implements IDrawingObject {
|
||||
private DrawingBus _bus = null;
|
||||
|
||||
public DrawingObjectBus(DrawingBus bus)
|
||||
{
|
||||
_bus = bus;
|
||||
}
|
||||
|
||||
public float Step() {
|
||||
if (_bus != null && _bus.Bus != null) {
|
||||
return _bus.Bus.Step;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Position GetCurrentPosition()
|
||||
{
|
||||
if (_bus != null) {
|
||||
return _bus.GetCurrentPosition();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void MoveObject(Direction direction)
|
||||
{
|
||||
_bus.MoveTransport(direction);
|
||||
}
|
||||
|
||||
public void SetObject(int x, int y, int width, int height)
|
||||
{
|
||||
_bus.SetPosition(x, y, width, height);
|
||||
}
|
||||
|
||||
public void DrawingObject(GraphicsContext gc)
|
||||
{
|
||||
_bus.DrawTransport(gc);
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class DrawingPolymorphBus<T extends EntityBus, U extends IDrawingDoors> {
|
||||
Object[] buses;
|
||||
Object[] doors;
|
||||
|
||||
int busesCount = 0;
|
||||
int doorsCount = 0;
|
||||
|
||||
public DrawingPolymorphBus(int busesCount, int doorsCount) {
|
||||
buses = new Object[busesCount];
|
||||
doors = new Object[doorsCount];
|
||||
}
|
||||
|
||||
public int AddEntity(T boat)
|
||||
{
|
||||
if(busesCount < buses.length){
|
||||
buses[busesCount] = boat;
|
||||
return busesCount++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int AddDoors(U paddle)
|
||||
{
|
||||
if(doorsCount < doors.length){
|
||||
doors[doorsCount]=paddle;
|
||||
return doorsCount++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public DrawingBus CreateBus() {
|
||||
int idBus = new Random().nextInt(busesCount);
|
||||
int idDoor = new Random().nextInt(doorsCount);
|
||||
T selectedBus = (T)buses[idBus];
|
||||
U selectedDoors = (U)doors[idDoor];
|
||||
if (selectedBus instanceof EntityDDB) {
|
||||
return new DrawingDDB(selectedBus, selectedDoors);
|
||||
}
|
||||
return new DrawingBus(selectedBus, selectedDoors);
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class DrawingTriangleDoors implements IDrawingDoors{
|
||||
private CountOfDoors _countOfDoors;
|
||||
|
||||
public void FillTriangle(GraphicsContext gc, float x, float y) {
|
||||
gc.fillPolygon(new double[] {(double) x, (double) (x + 5), (double) (x + 10)},
|
||||
new double[] {(double) y + 20, (double) (y), (double) y + 20}, 3) ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void DrawDoors(GraphicsContext gc, float _startPosX, float _startPosY) {
|
||||
gc.setFill(Color.BLUE);
|
||||
FillTriangle(gc, _startPosX, _startPosY + 20);
|
||||
FillTriangle(gc,_startPosX + 20, _startPosY + 20);
|
||||
FillTriangle(gc,_startPosX + 40, _startPosY + 20);
|
||||
if (_countOfDoors.getId() >= 4) {
|
||||
FillTriangle(gc, _startPosX + 60, _startPosY + 20);
|
||||
}
|
||||
if (_countOfDoors.getId() >= 5) {
|
||||
FillTriangle(gc, _startPosX + 80, _startPosY + 20);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCountOfDoors(int count) {
|
||||
for (CountOfDoors item: CountOfDoors.values()) {
|
||||
if (item.getId() == count) {
|
||||
_countOfDoors = item;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@ public class EntityBus {
|
||||
public Color BodyColor;
|
||||
public float Step;
|
||||
|
||||
public void Init(int speed, float weight, Color bodyColor)
|
||||
public EntityBus(int speed, float weight, Color bodyColor)
|
||||
{
|
||||
Random rnd = new Random();
|
||||
Speed = (speed <= 0) ? rnd.nextInt(50, 150): speed;
|
||||
|
@ -0,0 +1,33 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class EntityDDB extends EntityBus {
|
||||
|
||||
public Color ExtraColor;
|
||||
|
||||
public boolean Ladder;
|
||||
|
||||
public boolean SecondStage;
|
||||
|
||||
|
||||
private void setExtraColor(Color extraColor) {
|
||||
ExtraColor = extraColor;
|
||||
}
|
||||
|
||||
private void setLadder(boolean ladder) {
|
||||
Ladder = ladder;
|
||||
}
|
||||
|
||||
private void setSecondStage(boolean secondStage) {
|
||||
SecondStage = secondStage;
|
||||
}
|
||||
|
||||
public EntityDDB(int speed, float height, Color bodyColor, Color extraColor, boolean ladder, boolean secondStage)
|
||||
{
|
||||
super(speed, height, bodyColor);
|
||||
ExtraColor = extraColor;
|
||||
Ladder = ladder;
|
||||
SecondStage = secondStage;
|
||||
}
|
||||
}
|
@ -7,14 +7,17 @@ import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class FormBus extends Application {
|
||||
public class Form extends Application {
|
||||
static Stage myStage;
|
||||
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormBus.class.getResource("hello-view.fxml"));
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(Form.class.getResource("FormPolymorph.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load());
|
||||
stage.setTitle("DoubleDeckerBus");
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
myStage = stage;
|
||||
myStage.setTitle("DoubleDeckerBus");
|
||||
myStage.setScene(scene);
|
||||
myStage.show();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
@ -0,0 +1,9 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public interface IDrawingDoors {
|
||||
void DrawDoors(GraphicsContext gc, float _startPosX, float _startPosY);
|
||||
void setCountOfDoors(int count);
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
|
||||
public interface IDrawingObject {
|
||||
float Step = -1;
|
||||
|
||||
void SetObject(int x, int y, int width, int height);
|
||||
|
||||
void MoveObject(Direction direction);
|
||||
|
||||
void DrawingObject(GraphicsContext g);
|
||||
|
||||
Position GetCurrentPosition();
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class MapWithSetBusesGeneric<T extends IDrawingObject, U extends AbstractMap> {
|
||||
private final int _pictureWidth;
|
||||
private final int _pictureHeight;
|
||||
private final int _placeSizeWidth = 210;
|
||||
private final int _placeSizeHeight = 90;
|
||||
private final SetBusesGeneric<T> _setBuses;
|
||||
private U _map;
|
||||
|
||||
public MapWithSetBusesGeneric(int picWidth, int picHeight, U map)
|
||||
{
|
||||
int width = picWidth / _placeSizeWidth;
|
||||
int height = picHeight / _placeSizeHeight;
|
||||
_setBuses = new SetBusesGeneric<T>(width * height);
|
||||
_pictureWidth = picWidth;
|
||||
_pictureHeight = picHeight;
|
||||
_map = map;
|
||||
}
|
||||
|
||||
public void changeMap(U map) {
|
||||
_map = map;
|
||||
}
|
||||
|
||||
public int add(T bus)
|
||||
{
|
||||
return _setBuses.Insert(bus);
|
||||
}
|
||||
|
||||
public T remove(int position)
|
||||
{
|
||||
return _setBuses.Remove(position);
|
||||
}
|
||||
|
||||
public void ShowSet(GraphicsContext gc)
|
||||
{
|
||||
DrawBackground(gc);
|
||||
DrawBuses(gc);
|
||||
}
|
||||
|
||||
public void ShowOnMap(GraphicsContext gc)
|
||||
{
|
||||
Shaking();
|
||||
for (int i = 0; i < _setBuses.Count(); i++)
|
||||
{
|
||||
var bus = _setBuses.Get(i);
|
||||
if (bus != null)
|
||||
{
|
||||
_map.CreateMap(_pictureWidth, _pictureHeight, bus, gc);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void MoveObject(Direction direction)
|
||||
{
|
||||
if (_map != null)
|
||||
{
|
||||
_map.MoveObject(direction);
|
||||
}
|
||||
}
|
||||
|
||||
private void Shaking()
|
||||
{
|
||||
int j = _setBuses.Count() - 1;
|
||||
for (int i = 0; i < _setBuses.Count(); i++)
|
||||
{
|
||||
if (_setBuses.Get(i) == null)
|
||||
{
|
||||
for (; j > i; j--)
|
||||
{
|
||||
var bus = _setBuses.Get(j);
|
||||
if (bus != null)
|
||||
{
|
||||
_setBuses.Insert(bus, i);
|
||||
_setBuses.Remove(j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j <= i)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawBackground(GraphicsContext gc)
|
||||
{
|
||||
gc.setFill(Color.BLACK);
|
||||
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++)
|
||||
{
|
||||
for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j)
|
||||
{//линия рамзетки места
|
||||
gc.strokeLine(i * _placeSizeWidth, j * _placeSizeHeight,
|
||||
i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight);
|
||||
}
|
||||
gc.strokeLine(i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawBuses(GraphicsContext gc) {
|
||||
int width = _pictureWidth / _placeSizeWidth;
|
||||
int height = _pictureHeight / _placeSizeHeight;
|
||||
|
||||
int currentWidth = width - 1;
|
||||
int currentHeight = 0;
|
||||
|
||||
for (int i = 0; i < _setBuses.Count(); i++) {
|
||||
if (_setBuses.Get(i) == null){
|
||||
continue;
|
||||
}
|
||||
|
||||
_setBuses.Get(i).SetObject(currentWidth * _placeSizeWidth,
|
||||
currentHeight * _placeSizeHeight,
|
||||
_pictureWidth, _pictureHeight);
|
||||
_setBuses.Get(i).DrawingObject(gc);
|
||||
|
||||
if (currentWidth > 0)
|
||||
currentWidth--;
|
||||
else {
|
||||
currentWidth = width - 1;
|
||||
currentHeight++;
|
||||
}
|
||||
if (currentHeight > height) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
public class Position {
|
||||
public float Left;
|
||||
public float Right;
|
||||
public float Top;
|
||||
public float Bottom;
|
||||
|
||||
public Position (float left, float right, float top, float bottom) {
|
||||
Left = left;
|
||||
Right = right;
|
||||
Top = top;
|
||||
Bottom = bottom;
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
class SetBusesGeneric<T> {
|
||||
private Object[] _places;
|
||||
private int BusyPlaces = 0;
|
||||
|
||||
public SetBusesGeneric(int count) {
|
||||
_places = new Object[count];
|
||||
}
|
||||
|
||||
public int Insert(T bus)
|
||||
{
|
||||
return Insert(bus, 0);
|
||||
}
|
||||
|
||||
public int Insert(T bus, int position)
|
||||
{
|
||||
if (position < 0 || position >= _places.length|| BusyPlaces == _places.length) return -1;
|
||||
|
||||
BusyPlaces++;
|
||||
while (_places[position] != null) {
|
||||
for (int i = _places.length - 1; i > 0; --i) {
|
||||
if (_places[i] == null && _places[i - 1] != null) {
|
||||
_places[i] = _places[i - 1];
|
||||
_places[i - 1] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
_places[position] = bus;
|
||||
return position;
|
||||
}
|
||||
|
||||
public T Remove(int position)
|
||||
{
|
||||
if (position < 0 || position >= _places.length) return null;
|
||||
T savedBus = (T)_places[position];
|
||||
_places[position] = null;
|
||||
return savedBus;
|
||||
}
|
||||
|
||||
public T Get(int position)
|
||||
{
|
||||
if (position < 0 || position >= _places.length) return null;
|
||||
return (T)_places[position];
|
||||
}
|
||||
|
||||
public int Count() {
|
||||
return _places.length;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,44 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class SimpleMap extends AbstractMap{
|
||||
@Override
|
||||
protected void GenerateMap() {
|
||||
_map = new int[100][100];
|
||||
_size_x = (float)_width / _map.length;
|
||||
_size_y = (float)_height / _map[0].length;
|
||||
|
||||
for (int i = 0; i < _map.length; ++i)
|
||||
{
|
||||
for (int j = 0; j < _map[0].length; ++j)
|
||||
{
|
||||
_map[i][j] = _freeRoad;
|
||||
}
|
||||
}
|
||||
|
||||
int counter = 0;
|
||||
while (counter < 20)
|
||||
{
|
||||
int x = _random.nextInt(0, 100);
|
||||
int y = _random.nextInt(0, 100);
|
||||
if (_map[x][y] == _freeRoad)
|
||||
{
|
||||
_map[x][y] = _barrier;
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void DrawRoadPart(int i, int j) {
|
||||
gc.setFill(Color.GRAY);
|
||||
gc.fillRect(i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void DrawBarrierPart(int i, int j) {
|
||||
gc.setFill(Color.BLACK);
|
||||
gc.fillRect(i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1));
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.example.doubledeckerbus;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class WaterMap extends AbstractMap{
|
||||
@Override
|
||||
protected void GenerateMap() {
|
||||
_map = new int[100][100];
|
||||
_size_x = (float)_width / _map.length;
|
||||
_size_y = (float)_height / _map[0].length;
|
||||
|
||||
for (int i = 0; i < _map.length; ++i)
|
||||
{
|
||||
for (int j = 0; j < _map[0].length; ++j)
|
||||
{
|
||||
_map[i][j] = _freeRoad;
|
||||
}
|
||||
}
|
||||
|
||||
int counter = 0;
|
||||
while (counter < 50)
|
||||
{
|
||||
int x = _random.nextInt(0, 100);
|
||||
int y = _random.nextInt(0, 100);
|
||||
if (_map[x][y] == _freeRoad)
|
||||
{
|
||||
_map[x][y] = _barrier;
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void DrawRoadPart(int i, int j) {
|
||||
if (_random.nextInt(0,20) == 9) {
|
||||
gc.setFill(Color.GREEN);
|
||||
}
|
||||
else {
|
||||
gc.setFill(Color.LIGHTGREEN);
|
||||
}
|
||||
gc.fillRect(i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void DrawBarrierPart(int i, int j) {
|
||||
gc.setFill(Color.BLUE);
|
||||
gc.fillRect(i * _size_x, j * _size_y, i * (_size_x + 1), j * (_size_y + 1));
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ module com.example.doubledeckerbus {
|
||||
|
||||
requires org.controlsfx.controls;
|
||||
requires org.kordamp.bootstrapfx.core;
|
||||
requires javafx.graphics;
|
||||
|
||||
opens com.example.doubledeckerbus to javafx.fxml;
|
||||
exports com.example.doubledeckerbus;
|
||||
|
@ -66,7 +66,9 @@
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic></Button>
|
||||
<Button fx:id="buttonCreate" layoutY="455.0" mnemonicParsing="false" onAction="#ButtonCreate_Click" text="Создать" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="0.0" />
|
||||
<Button fx:id="buttonCreate" layoutX="6.0" layoutY="565.0" mnemonicParsing="false" onAction="#ButtonCreate_Click" text="Создать" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="6.0" />
|
||||
<Button fx:id="buttonCreateExtra" layoutX="90.0" layoutY="565.0" mnemonicParsing="false" onAction="#ButtonCreateExtra_Click" text="Продвинутый объект" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="90.0" />
|
||||
<Button fx:id="buttonSelectBus" layoutX="840.0" layoutY="565.0" mnemonicParsing="false" onAction="#ButtonSelectBus_Click" text="Выбрать" AnchorPane.bottomAnchor="14.0" AnchorPane.rightAnchor="104.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.Group?>
|
||||
<?import javafx.scene.canvas.Canvas?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ChoiceBox?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.image.Image?>
|
||||
<?import javafx.scene.image.ImageView?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
|
||||
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="463.0" prefWidth="779.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.doubledeckerbus.ControllerMapWithSetBus">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="ALWAYS" maxWidth="463.0" minWidth="10.0" percentWidth="70.0" prefWidth="423.0" />
|
||||
<ColumnConstraints hgrow="NEVER" maxWidth="294.0" minWidth="10.0" percentWidth="30.0" prefWidth="177.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane fx:id="pictureBoxBus" prefHeight="9.9999999E7" prefWidth="9.9999999E7">
|
||||
<children>
|
||||
<Canvas fx:id="canvasBus" height="463.0" width="537.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<Group GridPane.columnIndex="1" />
|
||||
<GridPane GridPane.columnIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="100.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="120.0" minHeight="0.0" prefHeight="34.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="200.0" minHeight="10.0" prefHeight="24.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="200.0" minHeight="8.0" prefHeight="27.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="269.0" minHeight="10.0" prefHeight="65.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="250.0" minHeight="0.0" prefHeight="44.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="272.0" minHeight="10.0" prefHeight="34.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="272.0" minHeight="0.0" prefHeight="46.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="272.0" minHeight="0.0" prefHeight="46.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="272.0" minHeight="10.0" prefHeight="134.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<ChoiceBox fx:id="comboBoxSelectorMap" prefHeight="50.0" prefWidth="9.9999999E7" />
|
||||
<Button fx:id="buttonAddBus" mnemonicParsing="false" onAction="#ButtonAddBus_Click" prefHeight="50.0" prefWidth="9.999999999E9" text="Добавить автобус" GridPane.rowIndex="2" />
|
||||
<TextField fx:id="textBoxPosition" GridPane.rowIndex="3" />
|
||||
<Button fx:id="buttonRemoveCar" mnemonicParsing="false" onAction="#ButtonRemoveBus_Click" prefHeight="63.0" prefWidth="9.999999999E9" text="Удалить автобус" GridPane.rowIndex="4" />
|
||||
<Button fx:id="buttonShowMap" mnemonicParsing="false" onAction="#ButtonShowOnMap_Click" prefHeight="63.0" prefWidth="9.99999999999E11" text="Посмотреть карту" GridPane.rowIndex="7" />
|
||||
<AnchorPane prefHeight="157.0" prefWidth="332.0" GridPane.rowIndex="8">
|
||||
<children>
|
||||
<Button fx:id="buttonLeft" layoutX="38.0" layoutY="52.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#ButtonMove_Click" prefHeight="30.0" prefWidth="30.0" AnchorPane.bottomAnchor="52.0" AnchorPane.rightAnchor="111.0">
|
||||
<graphic>
|
||||
<ImageView fitHeight="27.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@images/LeftArrow.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button fx:id="buttonDown" layoutX="68.0" layoutY="82.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#ButtonMove_Click" prefHeight="30.0" prefWidth="30.0" AnchorPane.bottomAnchor="22.0" AnchorPane.rightAnchor="81.0">
|
||||
<graphic>
|
||||
<ImageView fitHeight="27.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@images/DownArrow.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button fx:id="buttonRight" layoutX="98.0" layoutY="52.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#ButtonMove_Click" prefHeight="30.0" prefWidth="30.0" AnchorPane.bottomAnchor="52.0" AnchorPane.rightAnchor="51.0">
|
||||
<graphic>
|
||||
<ImageView fitHeight="27.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@images/RightArrow.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button fx:id="buttonUp" layoutX="68.0" layoutY="22.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#ButtonMove_Click" prefHeight="30.0" prefWidth="30.0" AnchorPane.bottomAnchor="82.0" AnchorPane.rightAnchor="81.0">
|
||||
<graphic>
|
||||
<ImageView fitHeight="27.0" fitWidth="10.0" pickOnBounds="true" preserveRatio="true">
|
||||
<image>
|
||||
<Image url="@images/UpArrow.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<Button fx:id="buttonShowStorage" mnemonicParsing="false" onAction="#ButtonShowStorage_Click" prefHeight="50.0" prefWidth="1.0E16" text="Посмотреть хранилище" GridPane.rowIndex="6" />
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</GridPane>
|
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.canvas.Canvas?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ChoiceBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
|
||||
<GridPane alignment="CENTER" prefHeight="691.0" prefWidth="1041.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.doubledeckerbus.ControllerPolymorph">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="ALWAYS" minWidth="10.0" percentWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints fillHeight="false" maxHeight="1.7976931348623157E308" percentHeight="90.0" vgrow="ALWAYS" />
|
||||
<RowConstraints fillHeight="false" maxHeight="-Infinity" minHeight="-Infinity" percentHeight="10.0" prefHeight="31.0" vgrow="NEVER" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="57.0" prefWidth="777.0" spacing="20.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label fx:id="statusSpeed" text="Скорость:" />
|
||||
<Label fx:id="statusWeight" text="Вес:" />
|
||||
<Label fx:id="statusColor" text="Цвет:" />
|
||||
<Label text="Колл-во дверей:" />
|
||||
<ChoiceBox fx:id="choiceDoors" prefHeight="24.0" prefWidth="58.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<AnchorPane fx:id="pictureBoxBus" maxHeight="2000000.0" maxWidth="2000000.0" minHeight="0.0" minWidth="0.0" prefHeight="603.0" prefWidth="1020.0">
|
||||
<children>
|
||||
<Canvas fx:id="canvasBus" layoutY="38.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
<Button fx:id="buttonCreate" layoutX="6.0" layoutY="565.0" mnemonicParsing="false" onAction="#ButtonCreate_Click" text="Создать" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="6.0" />
|
||||
<Button fx:id="buttonCreateExtra" layoutX="90.0" layoutY="565.0" mnemonicParsing="false" onAction="#ButtonCreateExtra_Click" text="Продвинутый объект" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="90.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</padding>
|
||||
</GridPane>
|
Loading…
Reference in New Issue
Block a user