Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
package robots.controller;

import robots.gui.GameVisualizer;
import robots.models.RobotModel;
package robots.game;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
package robots.gui;

import robots.models.RobotModel;
package robots.game;

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

/**
* Класс GameVisualizer представляет собой панель для визуализации состояния робота и его цели.
*/
public class GameVisualizer extends JPanel implements PropertyChangeListener {
private RobotModel robotModel;
public class GameVisualizer extends JComponent implements PropertyChangeListener {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Забыли обновить JavaDoc, теперь это не панель

private final RobotModel robotModel;

/**
* Создает новый объект GameVisualizer.
* Устанавливает параметры двойной буферизации для улучшения производительности отрисовки и
* подписывается на события изменения состояния робота через объект PropertyChangeSupport.
*
* @param propertyChangeSupport объект PropertyChangeSupport для подписки на события изменения состояния робота
*/
public GameVisualizer(PropertyChangeSupport propertyChangeSupport) {
propertyChangeSupport.addPropertyChangeListener(this);
public GameVisualizer(RobotModel robotModel) {
this.robotModel = robotModel;
robotModel.addListener(this);
setDoubleBuffered(true);
}

Expand Down Expand Up @@ -108,8 +104,7 @@ private void onRedrawEvent() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("robot_update")) {
this.robotModel = (RobotModel) evt.getNewValue();
if (evt.getPropertyName().equals("model_update")) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кстати, "model_update" лучше вынести в константу. Тогда если она изменится, то это сразу поменяется во всех местах.

onRedrawEvent();
}
}
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/robots/game/MVCController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package robots.game;

import javax.swing.*;

/**
* Интерфейс MVCController определяет методы, которые должен реализовать контроллер
* для управления графическим интерфейсом пользователя в рамках архитектуры MVC.
*/
public interface MVCController {
/**
* Возвращает компонент, ответственный за рисование или отображение данных.
*
* @return компонент, реализующий интерфейс {@link JComponent}, который используется для рисования или отображения данных.
*/
JComponent getPainter();
}
15 changes: 15 additions & 0 deletions src/main/java/robots/game/MVCControllerWithWindows.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package robots.game;

import javax.swing.*;

/**
* Интерфейс для модулей с дополнительными окнами
*/
public interface MVCControllerWithWindows extends MVCController {
/**
* Возвращает массив внутренних окон, которые управляются контроллером.
*
* @return массив объектов {@link JInternalFrame}, представляющих внутренние окна, управляемые контроллером.
*/
JInternalFrame[] getWindows();
}
44 changes: 44 additions & 0 deletions src/main/java/robots/game/ModuleController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package robots.game;

import javax.swing.*;

/**
* Класс для инкапсулирования логики работы модуля с игрой.
*/
public class ModuleController implements MVCControllerWithWindows {
private final GameVisualizer gameVisualizer;
private final JInternalFrame[] jInternalFrames;

/**
* Конструктор модуля с какой-либо базовой логикой робота
*/
public ModuleController() {
RobotModel robotModel = new RobotModel();
gameVisualizer = new GameVisualizer(robotModel);
GameController gameController = new GameController(robotModel, gameVisualizer);

WindowWithCoordinates wwc = new WindowWithCoordinates();
robotModel.addListener(wwc);
jInternalFrames = new JInternalFrame[]{wwc};

gameController.start();
}

/**
* Предоставление отрисовщика робота
* @return графический элемент, который будет отрисовывать работу робота
*/
@Override
public JComponent getPainter() {
return gameVisualizer;
}

/**
* Возвращает список зависимых окон
* @return массив с зависимыми окнами
*/
@Override
public JInternalFrame[] getWindows() {
return jInternalFrames;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package robots.models;
package robots.game;

import java.awt.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

/**
* Класс RobotModel представляет модель робота в игре.
*/
public class RobotModel {
private final PropertyChangeSupport propertyChangeSupport;

// Позиция робота
private double posX = 100;
private double posY = 100;
Expand All @@ -24,13 +23,13 @@ public class RobotModel {
private int targetX = 150;
private int targetY = 100;

private final PropertyChangeSupport pcs;

/**
* Конструктор класса Robot.
*
* @param propertyChangeSupport объект PropertyChangeSupport для поддержки событий изменения свойств
*/
public RobotModel(PropertyChangeSupport propertyChangeSupport) {
this.propertyChangeSupport = propertyChangeSupport;
public RobotModel() {
pcs = new PropertyChangeSupport(this);
}

/**
Expand Down Expand Up @@ -128,11 +127,19 @@ private double normalizeRadians(double angle) {
return angle;
}

/**
* Добавляет слушателя
* @param pcl слушатель
*/
public void addListener(PropertyChangeListener pcl) {
pcs.addPropertyChangeListener(pcl);
}

/**
* Уведомляет слушателей об изменении состояния модели робота.
*/
private void notifyListeners() {
propertyChangeSupport.firePropertyChange("robot_update", null, this);
pcs.firePropertyChange("model_update", null, this);
}

public double getPosX() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package robots.gui;
package robots.game;

import robots.locale.LanguageManager;
import robots.log.Logger;
import robots.models.RobotModel;
import robots.serialize.Stateful;

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.DecimalFormat;

/**
Expand All @@ -23,13 +20,12 @@ public class WindowWithCoordinates extends JInternalFrame implements Stateful, P
/**
* Конструктор класса WindowWithCoordinates.
*/
public WindowWithCoordinates(PropertyChangeSupport propertyChangeSupport) {
public WindowWithCoordinates() {
super(LanguageManager.getStr("WindowWithCoordinates.title"),
true,
true,
true,
true);
propertyChangeSupport.addPropertyChangeListener(this);

xCord = new JLabel("x");
yCord = new JLabel("y");
Expand All @@ -43,14 +39,10 @@ public WindowWithCoordinates(PropertyChangeSupport propertyChangeSupport) {
pack();

setLocation(770, 10);

Logger.debug("WindowWithCoordinates.title");
}

/**
* Обновляет отображаемые координаты на основе состояния робота.
*
* @param robotModel модель робота
*/
private void updateCoords(RobotModel robotModel) {
xCord.setText("x: " + df.format(robotModel.getPosX()));
Expand All @@ -59,9 +51,8 @@ private void updateCoords(RobotModel robotModel) {

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("robot_update")) {
RobotModel robotModel = (RobotModel) evt.getNewValue();
updateCoords(robotModel);
if (evt.getPropertyName().equals("model_update")) {
updateCoords((RobotModel) evt.getNewValue());
}
}

Expand Down
15 changes: 2 additions & 13 deletions src/main/java/robots/gui/GameWindow.java
Original file line number Diff line number Diff line change
@@ -1,41 +1,30 @@
package robots.gui;

import robots.controller.GameController;
import robots.locale.LanguageManager;
import robots.log.Logger;
import robots.models.RobotModel;
import robots.serialize.Stateful;

import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeSupport;

/**
* Класс GameWindow представляет собой внутреннее окно Swing, содержащее игровое поле.
*/
public class GameWindow extends JInternalFrame implements Stateful {
/**
* Создает новое игровое окно с заданным объектом PropertyChangeSupport.
*
* @param propertyChangeSupport объект PropertyChangeSupport для обмена данными с контроллером игры
*/
public GameWindow(PropertyChangeSupport propertyChangeSupport) {
public GameWindow(JComponent jComponent) {
super(LanguageManager.getStr("GameWindow.title"),
true,
true,
true,
true);

RobotModel robotModel = new RobotModel(propertyChangeSupport);
GameVisualizer gameVisualizer = new GameVisualizer(propertyChangeSupport);
GameController gameController = new GameController(robotModel, gameVisualizer);

JPanel panel = new JPanel(new BorderLayout());
panel.add(gameVisualizer, BorderLayout.CENTER);
panel.add(jComponent, BorderLayout.CENTER);
getContentPane().add(panel);

gameController.start();

setBounds(230, 10,
530, 530);

Expand Down
Loading