From 94859c468dab51056246f81d455e3825df6baf94 Mon Sep 17 00:00:00 2001 From: leoevgeniy <98206383+leoevgeniy@users.noreply.github.com> Date: Tue, 26 Dec 2023 23:37:23 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../antiaircraftgun/DrawingArmoredCar.java | 31 ++++++- .../antiaircraftgun/DrawingRollers.java | 26 ++++-- .../antiaircraftgun/EntityArmoredCar.java | 30 ++++--- .../antiaircraftgun/FormArmoredCar.java | 82 ++++++++++++------- 4 files changed, 122 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/example/antiaircraftgun/DrawingArmoredCar.java b/src/main/java/com/example/antiaircraftgun/DrawingArmoredCar.java index 8a9ef14..7da9a9e 100644 --- a/src/main/java/com/example/antiaircraftgun/DrawingArmoredCar.java +++ b/src/main/java/com/example/antiaircraftgun/DrawingArmoredCar.java @@ -5,43 +5,61 @@ import javafx.scene.paint.Color; public class DrawingArmoredCar { + // Экземпляр класса бронетранспорта private EntityArmoredCar _armoredCar; + // Экземпляр класса для отрисовки гусениц private DrawingRollers _drawingRollers; + // Начальная позиция по X private float _startPosX; + // Начальная позиция по Y private float _startPosY; + // Ширина изображения private Integer _pictureWidth; + // Высота изображения private Integer _pictureHeight; + // Ширина бронетранспорта private int _armoredCarWidth = 90; + // Высота бронетранспорта private int _armoredCarHeight = 40; + // Метод для получения объекта бронетранспорта public EntityArmoredCar GetArmoredCar() { return _armoredCar; } + + // Метод для получения объекта для отрисовки гусениц public DrawingRollers GetDrawningRollers() { return _drawingRollers; } + // Метод для инициализации бронетранспорта public void Init(int speed, float weight, Color bodyColor) { + // Создание экземпляра бронетранспорта и его инициализация _armoredCar = new EntityArmoredCar(); _armoredCar.Init(speed, weight, bodyColor); + // Создание экземпляра для отрисовки гусениц и его инициализация _drawingRollers = new DrawingRollers(); _drawingRollers.Init(bodyColor); } + // Метод для установки начальной позиции и размеров изображения public void SetPosition(int x, int y, int width, int height) { + // Проверка на отрицательные координаты if (x < 0 || y < 0) { return; } + // Проверка, чтобы бронетранспорт не выходил за границы изображения if (x + _armoredCarWidth > width || y + _armoredCarHeight > height) { return; } + // Установка начальных позиций и размеров изображения _startPosX = x; _startPosY = y; @@ -49,12 +67,15 @@ public class DrawingArmoredCar _pictureHeight = height; } + // Метод для перемещения бронетранспорта в указанном направлении public void MoveTransport(Direction direction) { + // Проверка на наличие размеров изображения if (_pictureWidth == null || _pictureHeight == null) { return; } + // Перемещение в зависимости от указанного направления switch (direction) { case Up: if (_startPosY - _armoredCar.GetStep() > 0) { @@ -85,20 +106,22 @@ public class DrawingArmoredCar } } + // Метод для отрисовки бронетранспорта public void DrawTransport(GraphicsContext gc) { + // Проверка на некорректные координаты или отсутствие размеров изображения if (_startPosX < 0 || _startPosY < 0 || _pictureWidth == null || _pictureHeight == null) { return; } - // Гусеницы + // Отрисовка гусениц gc.setFill(Color.GRAY); gc.fillRect(_startPosX + 10, _startPosY + 20, 70, 20); gc.fillOval(_startPosX, _startPosY + 20, 20, 20); gc.fillOval(_startPosX + 70, _startPosY + 20, 20, 20); _drawingRollers.DrawRollers(gc, _startPosX, _startPosY); - // Броня + // Отрисовка брони gc.setStroke(Color.BLACK); gc.setLineWidth(2); gc.setFill(_armoredCar.GetBodyColor()); @@ -111,17 +134,21 @@ public class DrawingArmoredCar gc.fillOval(_startPosX + 53, _startPosY + 16, 8, 8); } + // Метод для изменения границ изображения public void ChangeBorders(int width, int height) { + // Обновление размеров изображения _pictureWidth = width; _pictureHeight = height; + // Проверка, чтобы размеры изображения не были меньше размеров бронетранспорта if (_pictureWidth <= _armoredCarWidth || _pictureHeight <= _armoredCarHeight) { _pictureWidth = null; _pictureHeight = null; return; } + // Проверка, чтобы бронетранспорт не выходил за границы изображения if (_startPosX + _armoredCarWidth > _pictureWidth) { _startPosX = _pictureWidth - _armoredCarWidth; } diff --git a/src/main/java/com/example/antiaircraftgun/DrawingRollers.java b/src/main/java/com/example/antiaircraftgun/DrawingRollers.java index 935a54b..76e2627 100644 --- a/src/main/java/com/example/antiaircraftgun/DrawingRollers.java +++ b/src/main/java/com/example/antiaircraftgun/DrawingRollers.java @@ -3,25 +3,34 @@ package com.example.antiaircraftgun; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; +// Класс для отрисовки гусениц бронетранспорта public class DrawingRollers { + // Цвет гусениц private Color _RollersColor; + // Количество роликов private NumberRollers _numRollers; - public void SetNumberRollers(int numberRollers) - { + + // Метод для установки количества роликов + public void SetNumberRollers(int numberRollers) { _numRollers = NumberRollers.FromInteger(numberRollers); } - public void Init(Color trackRollersColor) - { + + // Метод для инициализации цвета гусениц + public void Init(Color trackRollersColor) { _RollersColor = trackRollersColor; } + // Метод для отрисовки гусениц public void DrawRollers(GraphicsContext gc, float startPosX, float startPosY) { + // Проверка на наличие цвета гусениц if (_RollersColor == null) { return; } + // Установка цвета гусениц gc.setFill(_RollersColor); + // В зависимости от количества роликов рисуем соответствующее количество switch (_numRollers) { case Four: DrawRoller1(gc, startPosX, startPosY); @@ -39,20 +48,27 @@ public class DrawingRollers { break; } } + + // Метод для отрисовки первого ролика void DrawRoller1(GraphicsContext gc, float startPosX, float startPosY) { gc.setFill(_RollersColor); - gc.fillOval(startPosX +1, startPosY + 21, 18, 18); + gc.fillOval(startPosX + 1, startPosY + 21, 18, 18); gc.fillOval(startPosX + 69, startPosY + 21, 18, 18); gc.fillOval(startPosX + 19, startPosY + 30, 11, 11); gc.fillOval(startPosX + 58, startPosY + 30, 11, 11); } + + // Метод для отрисовки второго ролика void DrawRoller2(GraphicsContext gc, float startPosX, float startPosY) { gc.setFill(_RollersColor); gc.fillOval(startPosX + 45, startPosY + 30, 11, 11); } + + // Метод для отрисовки третьего ролика void DrawRoller3(GraphicsContext gc, float startPosX, float startPosY) { gc.setFill(_RollersColor); gc.fillOval(startPosX + 32, startPosY + 30, 11, 11); } } + diff --git a/src/main/java/com/example/antiaircraftgun/EntityArmoredCar.java b/src/main/java/com/example/antiaircraftgun/EntityArmoredCar.java index ecbd464..6088dce 100644 --- a/src/main/java/com/example/antiaircraftgun/EntityArmoredCar.java +++ b/src/main/java/com/example/antiaircraftgun/EntityArmoredCar.java @@ -3,36 +3,42 @@ package com.example.antiaircraftgun; import javafx.scene.paint.Color; import java.util.Random; -public class EntityArmoredCar -{ +// Класс, представляющий бронетранспортное средство +public class EntityArmoredCar { + // Скорость бронетранспорта private int _speed; + // Вес бронетранспорта private float _weight; + // Цвет брони бронетранспорта private Color _bodyColor; - public int GetSpeed() - { + + // Метод для получения скорости бронетранспорта + public int GetSpeed() { return _speed; } - public float GetWeight() - { + // Метод для получения веса бронетранспорта + public float GetWeight() { return _weight; } - public Color GetBodyColor() - { + // Метод для получения цвета брони бронетранспорта + public Color GetBodyColor() { return _bodyColor; } - public float GetStep() - { + // Метод для вычисления шага бронетранспорта (скорость / вес) + public float GetStep() { return _speed * 100 / _weight; } - public void Init(int speed, float weight, Color bodyColor) - { + // Метод для инициализации параметров бронетранспорта + public void Init(int speed, float weight, Color bodyColor) { + // Инициализация случайными значениями, если параметры не переданы или некорректны Random random = new Random(); _speed = speed <= 0 ? random.nextInt(100) + 50 : speed; _weight = weight <= 0 ? random.nextInt(30) + 40 : weight; _bodyColor = bodyColor; } } + diff --git a/src/main/java/com/example/antiaircraftgun/FormArmoredCar.java b/src/main/java/com/example/antiaircraftgun/FormArmoredCar.java index 494c84f..159fb3b 100644 --- a/src/main/java/com/example/antiaircraftgun/FormArmoredCar.java +++ b/src/main/java/com/example/antiaircraftgun/FormArmoredCar.java @@ -20,35 +20,51 @@ import javafx.stage.Stage; import java.io.IOException; import java.util.Random; -public class FormArmoredCar extends Application -{ +// Класс, представляющий графическое приложение для управления бронетранспортом +public class FormArmoredCar extends Application { + // Панель приложения private Pane _root; + // Сцена приложения private Scene _scene; + // Холст для рисования private Canvas _canvas; + // Горизонтальный контейнер private HBox _hBox; + // Кнопка "Create" private Button _buttonCreate; + // Кнопки управления движением private Button _buttonUp; private Button _buttonDown; private Button _buttonLeft; private Button _buttonRight; + // Метки для отображения параметров бронетранспорта private Label _labelSpeedValue; private Label _labelWeightValue; private Label _labelBodyColorValue; + // Выпадающий список для выбора количества роликов private ComboBox _comboBoxNumRollers; + // Высота контейнера private double _hBoxHeight; + // Высота кнопки "Create" private double _buttonCreateHeight; + // Ширина и высота кнопок управления private final int _buttonMoveWidth = 30; private final int _buttonMoveHeight = 30; + // Расстояние между кнопками управления private final int _distanceBetweenMoveButtons = 5; + // Отступ кнопок от края окна private final double _buttonMargin = 10.0; + // Объект для отрисовки бронетранспорта private DrawingArmoredCar _armoredCar; + // Метод для запуска приложения @Override - public void start(Stage stage) throws IOException - { + public void start(Stage stage) throws IOException { + // Загрузка FXML-файла FXMLLoader fxmlLoader = new FXMLLoader(FormArmoredCar.class.getResource("hello-view.fxml")); _scene = new Scene(fxmlLoader.load(), 600, 400); + // Инициализация элементов интерфейса _root = (Pane) _scene.lookup("#root"); _root.setStyle("-fx-background-color: #31374c;"); @@ -62,10 +78,10 @@ public class FormArmoredCar extends Application stage.setTitle("AntiAircraftGun"); stage.setScene(_scene); + // Обработчики изменения размеров окна _scene.widthProperty().addListener((obs, oldVal, newVal) -> { UpdateGUI(); - if (_armoredCar != null) - { + if (_armoredCar != null) { _armoredCar.ChangeBorders((int) _canvas.getWidth(), (int) _canvas.getHeight()); } Draw(); @@ -73,8 +89,7 @@ public class FormArmoredCar extends Application _scene.heightProperty().addListener((obs, oldVal, newVal) -> { UpdateGUI(); - if (_armoredCar != null) - { + if (_armoredCar != null) { _armoredCar.ChangeBorders((int) _canvas.getWidth(), (int) _canvas.getHeight()); } Draw(); @@ -83,6 +98,7 @@ public class FormArmoredCar extends Application _root.applyCss(); _root.layout(); + // Инициализация при старте stage.setOnShowing(event -> { _hBoxHeight = _hBox.getHeight(); _buttonCreateHeight = _buttonCreate.getHeight(); @@ -93,12 +109,14 @@ public class FormArmoredCar extends Application stage.show(); } - private void InitHBox() - { + // Инициализация контейнера с параметрами бронетранспорта + private void InitHBox() { + // Создание горизонтального контейнера _hBox = new HBox(); _hBox.setStyle("-fx-background-color: #31374c;"); _root.getChildren().add(_hBox); + // Метки для параметров Label labelSpeed = new Label("Speed:"); labelSpeed.setStyle("-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;"); _hBox.getChildren().add(labelSpeed); @@ -127,6 +145,7 @@ public class FormArmoredCar extends Application labelNumRollers.setStyle("-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;"); _hBox.getChildren().add(labelNumRollers); + // Выпадающий список для выбора количества роликов ObservableList optionsForNumRollers = FXCollections.observableArrayList("4", "5", "6"); _comboBoxNumRollers = new ComboBox<>(optionsForNumRollers); _comboBoxNumRollers.setValue("4"); @@ -140,8 +159,9 @@ public class FormArmoredCar extends Application _hBox.getChildren().add(_comboBoxNumRollers); } - private void InitButtonCreate() - { + + // Инициализация кнопки "Create" + private void InitButtonCreate() { _buttonCreate = new Button("Create"); _buttonCreate.setTranslateX(_buttonMargin); _root.getChildren().add(_buttonCreate); @@ -152,7 +172,7 @@ public class FormArmoredCar extends Application _armoredCar = new DrawingArmoredCar(); _armoredCar.Init(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000, Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))); - _armoredCar.SetPosition(rnd.nextInt(90) + 10, rnd.nextInt(90)+10, + _armoredCar.SetPosition(rnd.nextInt(90) + 10, rnd.nextInt(90) + 10, (int) _canvas.getWidth(), (int) _canvas.getHeight()); _armoredCar.GetDrawningRollers().SetNumberRollers(Integer.parseInt(_comboBoxNumRollers.getValue())); @@ -164,12 +184,13 @@ public class FormArmoredCar extends Application Draw(); }); } - private void InitMoveButtons() - { + + // Инициализация кнопок управления движением + private void InitMoveButtons() { Image img; ImageView view; - // Button "Up" + // Кнопка "Up" _buttonUp = new Button(); img = new Image("arrowUp.png"); @@ -190,7 +211,7 @@ public class FormArmoredCar extends Application _root.getChildren().add(_buttonUp); - // Button "Down" + // Кнопка "Down" _buttonDown = new Button(); img = new Image("arrowDown.png"); @@ -211,7 +232,7 @@ public class FormArmoredCar extends Application _root.getChildren().add(_buttonDown); - // Button "Left" + // Кнопка "Left" _buttonLeft = new Button(); img = new Image("arrowLeft.png"); @@ -232,7 +253,7 @@ public class FormArmoredCar extends Application _root.getChildren().add(_buttonLeft); - // Button "Right" + // Кнопка "Right" _buttonRight = new Button(); img = new Image("arrowRight.png"); @@ -253,8 +274,9 @@ public class FormArmoredCar extends Application _root.getChildren().add(_buttonRight); } - private void UpdateGUI() - { + + // Обновление расположения элементов интерфейса при изменении размеров окна + private void UpdateGUI() { double sceneWidth = _scene.getWidth(); double sceneHeight = _scene.getHeight(); @@ -270,7 +292,7 @@ public class FormArmoredCar extends Application _buttonUp.setTranslateX(sceneWidth - _buttonMargin - _buttonMoveWidth * 2.0 - _distanceBetweenMoveButtons); _buttonDown.setTranslateY(sceneHeight - _hBoxHeight - _buttonMoveHeight - _buttonMargin); - _buttonDown.setTranslateX(sceneWidth- _buttonMargin - _buttonMoveWidth * 2.0 - _distanceBetweenMoveButtons); + _buttonDown.setTranslateX(sceneWidth - _buttonMargin - _buttonMoveWidth * 2.0 - _distanceBetweenMoveButtons); _buttonLeft.setTranslateY(sceneHeight - _hBoxHeight - _buttonMoveHeight - _buttonMargin); _buttonLeft.setTranslateX(sceneWidth - _buttonMargin - _buttonMoveWidth * 3.0 - @@ -280,26 +302,30 @@ public class FormArmoredCar extends Application _buttonRight.setTranslateX(sceneWidth - _buttonMargin - _buttonMoveWidth); } - private void Draw() - { + // Отрисовка на холсте + private void Draw() { GraphicsContext gc = _canvas.getGraphicsContext2D(); + // Очистка холста gc.clearRect(0.0, 0.0, _canvas.getWidth(), _canvas.getHeight()); + // Заполнение белым цветом gc.setFill(Color.WHITE); gc.fillRect(0.0, 0.0, _canvas.getWidth(), _canvas.getHeight()); + // Отрисовка рамки gc.setStroke(Color.BLACK); gc.setLineWidth(4); gc.strokeRect(0.0, 0.0, _canvas.getWidth(), _canvas.getHeight()); - if (_armoredCar != null) - { + // Отрисовка бронетранспорта, если он создан + if (_armoredCar != null) { _armoredCar.DrawTransport(gc); } } - public static void main(String[] args) - { + // Метод для запуска приложения + public static void main(String[] args) { launch(); } } +