PIbd-21 Sagirov M.M. LinerHard Lab1 #1
13
src/AdditionalEnum.java
Normal file
13
src/AdditionalEnum.java
Normal file
@ -0,0 +1,13 @@
|
||||
public enum AdditionalEnum {
|
||||
One(1),
|
||||
Two(2),
|
||||
Three(3),
|
||||
;
|
||||
private final int addEnum;
|
||||
AdditionalEnum(int i) {
|
||||
this.addEnum=i;
|
||||
}
|
||||
public int GetAddEnum() {
|
||||
return addEnum;
|
||||
}
|
||||
}
|
14
src/Direction.java
Normal file
14
src/Direction.java
Normal file
@ -0,0 +1,14 @@
|
||||
public enum Direction {
|
||||
Up(1),
|
||||
Down(2),
|
||||
Left (3),
|
||||
Right(4)
|
||||
;
|
||||
private final int Direct;
|
||||
Direction(int i) {
|
||||
this.Direct=i;
|
||||
}
|
||||
public int GetDirect() {
|
||||
return Direct;
|
||||
}
|
||||
}
|
41
src/DrawingDeck.java
Normal file
41
src/DrawingDeck.java
Normal file
@ -0,0 +1,41 @@
|
||||
import java.awt.*;
|
||||
public class DrawingDeck {
|
||||
private AdditionalEnum deckNumber;
|
||||
public void SetAddEnum(int num){
|
||||
switch (num){
|
||||
case 1:
|
||||
deckNumber = AdditionalEnum.One;
|
||||
break;
|
||||
case 2:
|
||||
deckNumber = AdditionalEnum.Two;
|
||||
break;
|
||||
default:
|
||||
deckNumber = AdditionalEnum.Three;
|
||||
}
|
||||
};
|
||||
public AdditionalEnum GetDeckNumber() {
|
||||
|
||||
return deckNumber;
|
||||
}
|
||||
public int DrawDeck(Color colorDeck, Graphics g, int _startPosX, int _startPosY) {
|
||||
eegov
commented
Почему 2 метода для рисования, а не один? Почему 2 метода для рисования, а не один?
|
||||
Graphics2D g2d = (Graphics2D) g;
|
||||
//Переделана логика вариативной отрисовки для снижения повторяющегося кода
|
||||
int k = deckNumber.GetAddEnum();
|
||||
if(k > 0){
|
||||
DrawNumDeck(g2d,k-1,_startPosX,_startPosY,colorDeck);
|
||||
return (k-1)*20; //20-высота одной палубы
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
public void DrawNumDeck(Graphics2D g2d, int numOfDecks,int _startPosX,int _startPosY,Color colorDeck){
|
||||
int yDiff = numOfDecks * 20;
|
||||
int[] xDeck = {_startPosX + 30, _startPosX + 30 + 60, _startPosX + 30 + 60, _startPosX+30};
|
||||
int[] yDeck = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 20 + yDiff, _startPosY + 20 + yDiff};
|
||||
g2d.setPaint(colorDeck);
|
||||
g2d.fillPolygon(xDeck,yDeck,4);
|
||||
g2d.setPaint(Color.BLACK);
|
||||
g2d.drawPolygon(xDeck,yDeck,4);
|
||||
if(numOfDecks > 0){
|
||||
DrawNumDeck(g2d,numOfDecks-1,_startPosX,_startPosY,colorDeck);
|
||||
}
|
||||
}
|
||||
}
|
98
src/DrawingLiner.java
Normal file
98
src/DrawingLiner.java
Normal file
@ -0,0 +1,98 @@
|
||||
import java.awt.*;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.util.*;
|
||||
|
||||
public class DrawingLiner {
|
||||
private EntityLiner EntityLiner; //Класс-сущность
|
||||
public EntityLiner GetLiner(){return EntityLiner;}
|
||||
public int _startPosX; //Координаты отрисовки по оси x
|
||||
public int _startPosY; //Координаты отрисовки по оси y
|
||||
private Integer _pictureWidth = null; //Ширина окна
|
||||
private Integer _pictureHeight = null; //Высота окна
|
||||
private final int _linerWidth = 120; //Ширина отрисовки лайнера
|
||||
private int _linerHeight = 60; //Высота отрисовки лайнера
|
||||
private DrawingDeck drawingDeck = new DrawingDeck();
|
||||
|
||||
//Инициализация
|
||||
public void Init(int speed, float weight, Color bottomColor, boolean swimmingPool, boolean deck)
|
||||
{
|
||||
EntityLiner = new EntityLiner();
|
||||
EntityLiner.Init(speed,weight,bottomColor, swimmingPool, deck);
|
||||
Random random = new Random();
|
||||
int rd = random.nextInt(0, 3);
|
||||
_linerHeight += rd*20;
|
||||
drawingDeck.SetAddEnum(rd);
|
||||
}
|
||||
|
||||
//Начальные коордитанты
|
||||
public void SetPosition(int x, int y, int width, int height)
|
||||
{
|
||||
if (width < _linerWidth || height < _linerHeight) return;
|
||||
Random random = new Random();
|
||||
_startPosX = x < 0 || x + _linerWidth > width ? random.nextInt(0, width - _linerWidth) : x;
|
||||
_startPosY = y < 0 || y + _linerHeight > height ? random.nextInt(0, height - _linerHeight) : y;
|
||||
_pictureWidth = width;
|
||||
_pictureHeight = height;
|
||||
}
|
||||
|
||||
//Движение транспорта по координатам
|
||||
public void MoveTransport(Direction direction)
|
||||
{
|
||||
if (GetLiner() == null) {
|
||||
return;
|
||||
}
|
||||
switch (direction.GetDirect()) {
|
||||
case 1:
|
||||
if (_startPosY - EntityLiner.GetStep() > 0) {
|
||||
_startPosY -= EntityLiner.GetStep();
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (_startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight) {
|
||||
_startPosY += EntityLiner.GetStep();
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (_startPosX - EntityLiner.GetStep() > 0) {
|
||||
_startPosX -= EntityLiner.GetStep();
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (_startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth) {
|
||||
_startPosX += EntityLiner.GetStep();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//Отрисовка транспорта
|
||||
public void DrawLiner(Graphics g) {
|
||||
if (GetLiner() == null) {
|
||||
return;
|
||||
}
|
||||
if (_startPosX < 0 || _startPosY < 0) {
|
||||
return;
|
||||
}
|
||||
int yDiff = drawingDeck.DrawDeck(Color.YELLOW, g, _startPosX, _startPosY)+20;//+1 основная палуба, желтая по умолчанию для обычног ообьекта
|
||||
Graphics2D g2d = (Graphics2D) g;
|
||||
g2d.setPaint(EntityLiner.GetBottomColor());
|
||||
//корпус
|
||||
int[] xBottom = {_startPosX, _startPosX + 100, _startPosX + 80, _startPosX + 20};
|
||||
int[] yBottom = {_startPosY + yDiff, _startPosY + yDiff, _startPosY + 40 + yDiff, _startPosY + 40 + yDiff};
|
||||
g2d.fillPolygon(xBottom, yBottom, 4);
|
||||
g2d.setPaint(Color.BLACK);
|
||||
g2d.drawPolygon(xBottom, yBottom, 4);
|
||||
}
|
||||
public boolean CanMove(Direction direction) {
|
||||
if (EntityLiner == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return switch (direction) {
|
||||
case Left -> _startPosX - EntityLiner.GetStep() > 0;
|
||||
case Up -> _startPosY - EntityLiner.GetStep() > 0;
|
||||
case Right -> _startPosX + _linerWidth + EntityLiner.GetStep() < _pictureWidth;
|
||||
case Down -> _startPosY + _linerHeight + EntityLiner.GetStep() < _pictureHeight;
|
||||
};
|
||||
}
|
||||
}
|
31
src/EntityLiner.java
Normal file
31
src/EntityLiner.java
Normal file
@ -0,0 +1,31 @@
|
||||
import java.awt.*;
|
||||
import java.util.*;
|
||||
|
||||
public class EntityLiner {
|
||||
private int Speed; //Скорость
|
||||
private float Weight; //Вес
|
||||
private Color BottomColor; //Цвет
|
||||
private float Step; //Шаг при перемещении
|
||||
private boolean Deck; //Наличие доп палубы
|
||||
private boolean SwimmingPool; //Наличие бассейна
|
||||
|
||||
//Инициализация
|
||||
public void Init(int speed, float weight, Color bodyColor, boolean swimmingPool, boolean deck)
|
||||
{
|
||||
Random random = new Random();
|
||||
Speed = speed <= 0 ? random.nextInt(50, 150) : speed;
|
||||
Weight = weight <= 0 ? random.nextInt(50, 150) : weight;
|
||||
BottomColor = bodyColor;
|
||||
SwimmingPool = swimmingPool;
|
||||
Deck = deck;
|
||||
Step = Speed * 100 / Weight;
|
||||
}
|
||||
public boolean GetDeck() {return Deck;}
|
||||
public boolean GetSwimmingPool() {return SwimmingPool;}
|
||||
public Color GetBottomColor(){
|
||||
return BottomColor;
|
||||
}
|
||||
public float GetStep(){
|
||||
return Step;
|
||||
}
|
||||
}
|
110
src/FormLiner.java
Normal file
110
src/FormLiner.java
Normal file
@ -0,0 +1,110 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.*;
|
||||
|
||||
public class FormLiner{
|
||||
private DrawingLiner _drawingLiner;
|
||||
Canvas canv;
|
||||
public void Draw(){
|
||||
canv.repaint();
|
||||
}
|
||||
public FormLiner(){
|
||||
JFrame frame = new JFrame("Liner");
|
||||
JButton buttonCreate = new JButton("Создать");
|
||||
buttonCreate.setFocusPainted(false);
|
||||
buttonCreate.setContentAreaFilled(false);
|
||||
JButton buttonUp = new JButton();
|
||||
buttonUp.setFocusPainted(false);
|
||||
buttonUp.setContentAreaFilled(false);
|
||||
buttonUp.setName("up");
|
||||
buttonUp.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowUp.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
|
||||
JButton buttonDown = new JButton();
|
||||
buttonDown.setFocusPainted(false);
|
||||
buttonDown.setContentAreaFilled(false);
|
||||
buttonDown.setName("down");
|
||||
buttonDown.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowDown.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
|
||||
JButton buttonLeft = new JButton();
|
||||
buttonLeft.setFocusPainted(false);
|
||||
buttonLeft.setContentAreaFilled(false);
|
||||
buttonLeft.setName("left");
|
||||
buttonLeft.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowLeft.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
|
||||
JButton buttonRight = new JButton();
|
||||
buttonRight.setFocusPainted(false);
|
||||
buttonRight.setContentAreaFilled(false);
|
||||
buttonRight.setName("right");
|
||||
buttonRight.setIcon(new ImageIcon(((new ImageIcon("src/Images/arrowRight.png")).getImage()).getScaledInstance(35, 35, java.awt.Image.SCALE_SMOOTH)));
|
||||
buttonCreate.addActionListener(
|
||||
e -> {
|
||||
Random random = new Random();
|
||||
_drawingLiner = new DrawingLiner();
|
||||
_drawingLiner.Init(
|
||||
random.nextInt(200) + 100,
|
||||
random.nextInt(2000) + 1000,
|
||||
new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)),
|
||||
random.nextBoolean(), random.nextBoolean());
|
||||
_drawingLiner.SetPosition(random.nextInt(100-30+1)+30, //начальные и конечные значения для рандома
|
||||
random.nextInt(90-20+1)+20 //начальные и конечные значения для рандома
|
||||
,this.canv.getWidth(), this.canv.getHeight());
|
||||
canv._drawingLiner = _drawingLiner;
|
||||
Draw();
|
||||
}
|
||||
);
|
||||
ActionListener actionListener = e -> {
|
||||
if (_drawingLiner == null){
|
||||
return;
|
||||
}
|
||||
switch ((((JButton)(e.getSource())).getName())){
|
||||
case "up":
|
||||
_drawingLiner.MoveTransport(Direction.Up);
|
||||
break;
|
||||
case "down":
|
||||
_drawingLiner.MoveTransport(Direction.Down);
|
||||
break;
|
||||
case "left":
|
||||
_drawingLiner.MoveTransport(Direction.Left);
|
||||
break;
|
||||
case "right":
|
||||
_drawingLiner.MoveTransport(Direction.Right);
|
||||
break;
|
||||
}
|
||||
Draw();
|
||||
};
|
||||
buttonUp.addActionListener(actionListener);
|
||||
buttonDown.addActionListener(actionListener);
|
||||
buttonLeft.addActionListener(actionListener);
|
||||
buttonRight.addActionListener(actionListener);
|
||||
frame.setSize(910, 500);
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setLayout(null);
|
||||
canv = new Canvas();
|
||||
canv.setBounds(0, 0, 895, 500 - 40); // 40 - const, высота панели сверху
|
||||
buttonCreate.setBounds(20, 420, 100, 40);
|
||||
buttonUp.setBounds(800, 380, 40, 40);
|
||||
buttonDown.setBounds(800, 420, 40, 40);
|
||||
buttonLeft.setBounds(760, 420, 40, 40);
|
||||
buttonRight.setBounds(840, 420, 40, 40);
|
||||
frame.add(canv);
|
||||
frame.add(buttonCreate);
|
||||
frame.add(buttonUp);
|
||||
frame.add(buttonDown);
|
||||
frame.add(buttonLeft);
|
||||
frame.add(buttonRight);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
class Canvas extends JComponent{
|
||||
public DrawingLiner _drawingLiner;
|
||||
public Canvas(){}
|
||||
|
||||
public void paintComponent(Graphics g){
|
||||
if (_drawingLiner == null){
|
||||
return;
|
||||
}
|
||||
super.paintComponents(g);
|
||||
Graphics2D g2d = (Graphics2D)g;
|
||||
_drawingLiner.DrawLiner(g2d);
|
||||
super.repaint();
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/Images/arrowDown.png
Normal file
BIN
src/Images/arrowDown.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
BIN
src/Images/arrowLeft.png
Normal file
BIN
src/Images/arrowLeft.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
BIN
src/Images/arrowRight.png
Normal file
BIN
src/Images/arrowRight.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
src/Images/arrowUp.png
Normal file
BIN
src/Images/arrowUp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
5
src/Main.java
Normal file
5
src/Main.java
Normal file
@ -0,0 +1,5 @@
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
FormLiner fm = new FormLiner();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user
Не требовалось