Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add logging beginning movement #44

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
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
81 changes: 81 additions & 0 deletions robots/src/gui/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package gui;

public interface Constants {

class MainApplicationFrameConstants {

public static final int SCREEN_OFFSET = 50;
public static final int INITIAL_GAME_WINDOW_HEIGHT = 400;
public static final int INITIAL_GAME_WINDOW_WIDTH = 400;
public static final int LOG_WINDOW_INITIAL_LOCATION_X = 10;
public static final int LOG_WINDOW_INITIAL_LOCATION_Y = 10;
public static final int LOG_WINDOW_INITIAL_WIDTH = 300;
public static final int LOG_WINDOW_INITIAL_HEIGHT = 800;
public static final String LOGGER_INITIAL_MESSAGE = "Протокол работает";
public static final String EXIT_BUTTON_TEXT = "Выход";
public static final String YES_BUTTON_TEXT_CONSTANT = "OptionPane.yesButtonText";
public static final String YES_BUTTON_TEXT = "Да";
public static final String NO_BUTTON_TEXT_CONSTANT = "OptionPane.noButtonText";
public static final String NO_BUTTON_TEXT = "Нет";
public static final String EXIT_CONFIRM_DIALOG_TEXT = "Вы уверены?";
public static final String EXIT_CONFIRM_DIALOG_TITLE = "ВЫХОД";
public static final String TEST_MENU_TEXT = "Тесты";
public static final String TEST_LOG_OPTION_TEXT = "Сообщение в лог";
public static final String TEST_LOG_TEXT = "Новая строка";
public static final String STYLE_MENU_TEXT = "Режим отображения";
public static final String CROSS_PLATFORM_STYLE_TEXT = "Универсальная схема";
public static final String SYSTEM_STYLE_TEXT = "Системная схема";
public static final String ROBOT_START_MOVING = "Робот двигается";
public static final String ROBOT_STOP_MOVING = "Робот остановился";
}

class RobotsProgramConstants {

public static final String NIMBUS_MENU_STYLE = "javax.swing.plaf.nimbus.NimbusLookAndFeel";
public static final String METAL_MENU_STYLE = "javax.swing.plaf.metal.MetalLookAndFeel";
}

class LogWindowConstants {

public static final String INITIAL_LOG_MESSAGE = "Протокол работы";
public static final int LOG_TEXT_AREA_WIDTH = 200;
public static final int LOG_TEXT_AREA_HEIGHT = 500;
}

class GameWindowConstants {

public static final String GAME_WINDOW_TITLE = "Игровое поле";
}

class GameVisualizerConstants {

public static final double ROBOT_VELOCITY = 0.1;
public static final double MAX_ANGULAR_VELOCITY = 0.001;
public static final double ROBOT_STOP_DISTANCE = 0.5;
public static final String TIMER_NAME = "events generator";
public static final int TIMER_DELAY = 0;
public static final int TIMER_REDRAW_PERIOD = 50;
public static final int TIMER_UPDATE_PERIOD = 10;
public static final int ROBOT_INITIAL_X_COORDINATE = 100;
public static final int ROBOT_INITIAL_Y_COORDINATE = 100;
public static final int ROBOT_INITIAL_DIRECTION = 0;
public static final int ROBOT_BODY_FIRST_DIAMETER = 30;
public static final int ROBOT_BODY_SECOND_DIAMETER = 10;
public static final int ROBOT_HEAD_X_OFFSET = 10;
public static final int ROBOT_HEAD_DIAMETER = 5;
public static final int TARGET_DIAMETER = 5;
public static final int TARGET_THETA = 0;
public static final int TARGET_ANCHORX = 0;
public static final int TARGET_ANCHORY = 0;
public static final int TARGET_INITIAL_X_COORDINATE = 150;
public static final int TARGET_INITIAL_Y_COORDINATE = 100;
}

class LoggerConstants {
public static final int LOGGER_IQUEUE_LENGTH = 100;
}

class KeyEventListenerConstants {
public static final double TARGET_VELOCITY = 0.1;
}
}
97 changes: 97 additions & 0 deletions robots/src/gui/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package gui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Timer;
import java.util.TimerTask;

import static gui.Constants.GameVisualizerConstants.*;
import static gui.MainApplicationFrame.updateStateRobot;

public class GameController extends JPanel {

private final Robot robot;
private final Target target;
private boolean isMoving;

public GameController(Robot robot, Target target) {
this.robot = robot;
this.target = target;
isMoving = false;
java.util.Timer timer = new Timer(TIMER_NAME, true);
timer.schedule(new TimerTask() {
@Override
public void run() {
onRedrawEvent();
}
}, TIMER_DELAY, TIMER_REDRAW_PERIOD);
timer.schedule(new TimerTask() {
@Override
public void run() {
onModelUpdateEvent();
}
}, TIMER_DELAY, TIMER_UPDATE_PERIOD);
this.setFocusable(true);
this.requestFocus();
addKeyListener(new KeyEventListener(target));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
target.setxCoordinate(event.getPoint().x);
target.setyCoordinate(event.getPoint().y);
repaint();
}
});
setDoubleBuffered(true);
}

private void onRedrawEvent() {
EventQueue.invokeLater(this::repaint);
}

private void onModelUpdateEvent() {
double distance = MathModule.calculateDistance(target.getxCoordinate(), target.getyCoordinate(), robot.getxCoordinate(), robot.getyCoordinate());
target.move();

if (distance < ROBOT_STOP_DISTANCE) {

if (isMoving) {
isMoving = false;
updateStateRobot(isMoving);
}
return;
}
if (!isMoving) {
isMoving = true;
updateStateRobot(isMoving);
}
double angleToTarget = MathModule.calculateAngle(robot.getxCoordinate(), robot.getyCoordinate(), target.getxCoordinate(), target.getyCoordinate());
if (angleToTarget == robot.getDirection()) {
robot.setAngularVelocity(0);
} else if (angleToTarget <= Math.PI) {
if (angleToTarget > robot.getDirection() || robot.getDirection() > angleToTarget + Math.PI) {
robot.setAngularVelocity(MAX_ANGULAR_VELOCITY);
} else {
robot.setAngularVelocity(-MAX_ANGULAR_VELOCITY);
}
}
else {
if (angleToTarget > robot.getDirection() && robot.getDirection() > angleToTarget - Math.PI) {
robot.setAngularVelocity(MAX_ANGULAR_VELOCITY);
} else {
robot.setAngularVelocity(-MAX_ANGULAR_VELOCITY);
}
}
robot.move();
}

@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
robot.draw(g2d);
target.draw(g2d);
}
}
32 changes: 32 additions & 0 deletions robots/src/gui/GameModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package gui;

import java.awt.*;

public abstract class GameModel {

private double xCoordinate;
private double yCoordinate;

public GameModel(double xCoordinate, double yCoordinate) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
}

public double getxCoordinate() {
return xCoordinate;
}

public void setxCoordinate(double xCoordinate) {
this.xCoordinate = xCoordinate;
}

public double getyCoordinate() {
return yCoordinate;
}

public void setyCoordinate(double yCoordinate) {
this.yCoordinate = yCoordinate;
}

public abstract void draw(Graphics2D g);
}
Loading