diff --git a/.idea/ProjectAirFighterHard.iml b/.idea/ProjectAirFighterHard.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/ProjectAirFighterHard.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b5bd8b0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AirFighter/AirFighter.iml b/AirFighter/AirFighter.iml new file mode 100644 index 0000000..f9e9a7d --- /dev/null +++ b/AirFighter/AirFighter.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/AirFighter/Images/Down.png b/AirFighter/Images/Down.png new file mode 100644 index 0000000..6378ef3 Binary files /dev/null and b/AirFighter/Images/Down.png differ diff --git a/AirFighter/Images/Left.png b/AirFighter/Images/Left.png new file mode 100644 index 0000000..559bcdc Binary files /dev/null and b/AirFighter/Images/Left.png differ diff --git a/AirFighter/Images/Right.png b/AirFighter/Images/Right.png new file mode 100644 index 0000000..7998769 Binary files /dev/null and b/AirFighter/Images/Right.png differ diff --git a/AirFighter/Images/Up.png b/AirFighter/Images/Up.png new file mode 100644 index 0000000..0282096 Binary files /dev/null and b/AirFighter/Images/Up.png differ diff --git a/AirFighter/src/Direction.java b/AirFighter/src/Direction.java new file mode 100644 index 0000000..b78a7cd --- /dev/null +++ b/AirFighter/src/Direction.java @@ -0,0 +1,7 @@ +// Направления +public enum Direction { + Up, + Down, + Left, + Right +} diff --git a/AirFighter/src/DrawningAirFighter.java b/AirFighter/src/DrawningAirFighter.java new file mode 100644 index 0000000..4cb2641 --- /dev/null +++ b/AirFighter/src/DrawningAirFighter.java @@ -0,0 +1,117 @@ +import java.awt.*; + +public class DrawningAirFighter { + /// Объект сущности военного самолета + public EntityAirFighter AirFighter; + private DrawningEngine _engine; + + // Левая координата отрисовки самолета + private int _startPosX; + // Верхняя кооридната отрисовки самолета + private int _startPosY; + // Ширина окна отрисовки + private int _pictureWidth = 0; + // Высота окна отрисовки + private int _pictureHeight = 0; + // Ширина отрисовки самолета + final int _airFighterWidth = 80; + // Высота отрисовки самолета + final int _airFighterHeight = 70; + + // Инициализация свойств + public void Init(int speed, float weight, Color bodyColor, int numberEngine) + { + _engine = new DrawningEngine(); + _engine.setCodeEngine(numberEngine); + AirFighter = new EntityAirFighter(); + AirFighter.Init(speed, weight, bodyColor); + } + + public void SetPosition(int x, int y, int width, int height) { + if(width < _airFighterWidth || height < _airFighterHeight) + { + _pictureWidth = 0; + _pictureHeight = 0; + return; + } + if(x < 0 || x + _airFighterWidth > width) + { + x = width - _airFighterWidth; + } + if(y < 0 || y + _airFighterHeight > height) + { + y = height - _airFighterHeight; + } + _startPosX = x; + _startPosY = y; + _pictureWidth = width; + _pictureHeight = height; + } + // Изменение направления перемещения + public void MoveTransport(Direction direction) + { + if (_pictureWidth == 0 || _pictureHeight == 0) { + return; + } + switch (direction) + { + // вправо + case Right: + if (_startPosX + _airFighterWidth + AirFighter.Step() < _pictureWidth) + { + _startPosX += AirFighter.Step(); + } + break; + //влево + case Left: + if(_startPosX - AirFighter.Step() >= 0){ + _startPosX -= AirFighter.Step(); + } + break; + //вверх + case Up: + if(_startPosY - AirFighter.Step() >= 0){ + _startPosY -= AirFighter.Step(); + } + break; + //вниз + case Down: + if (_startPosY + _airFighterHeight + AirFighter.Step() < _pictureHeight) + { + _startPosY += AirFighter.Step(); + } + break; + } + } + // Отрисовка самолета + public void DrawTransport(Graphics g){ + int[] pointX = new int[]{ _startPosX + 80, _startPosX + 70, _startPosX + 30, _startPosX + 35, _startPosX + 40, _startPosX + 40, _startPosX, _startPosX, _startPosX + 10, _startPosX + 10, _startPosX, _startPosX, _startPosX + 10, _startPosX + 10, _startPosX, _startPosX + 40, _startPosX + 40, _startPosX + 35, _startPosX + 30, _startPosX + 70, _startPosX + 80}; + int[] pointY = new int[]{ _startPosY + 35, _startPosY + 30, _startPosY + 30, _startPosY, _startPosY, _startPosY + 30, _startPosY + 30, _startPosY + 15, _startPosY + 25, _startPosY + 30, _startPosY + 30, _startPosY + 55, _startPosY + 45, _startPosY + 40, _startPosY + 40, _startPosY + 40, _startPosY + 70, _startPosY + 70, _startPosY + 40, _startPosY + 40, _startPosY + 35}; + g.setColor(AirFighter.getBodyColor()); + g.fillPolygon(pointX, pointY, 20); + g.setColor(Color.BLACK); + g.drawPolyline(pointX, pointY, 21); + _engine.DrawEngine(g, _startPosX, _startPosY, AirFighter.getBodyColor()); + } + // Смена границ формы отрисовки + public void ChangeBorders(int width, int height) + { + _pictureWidth = width; + _pictureHeight = height; + if (_pictureWidth <= _airFighterWidth || _pictureHeight <= _airFighterHeight) + { + _pictureWidth = 0; + _pictureHeight = 0; + return; + } + if (_startPosX + _airFighterWidth > _pictureWidth) + { + _startPosX = _pictureWidth - _airFighterWidth; + } + if (_startPosY + _airFighterHeight > _pictureHeight) + { + _startPosY = _pictureHeight - _airFighterHeight; + } + } +} + diff --git a/AirFighter/src/DrawningEngine.java b/AirFighter/src/DrawningEngine.java new file mode 100644 index 0000000..5e4fd98 --- /dev/null +++ b/AirFighter/src/DrawningEngine.java @@ -0,0 +1,35 @@ +import java.awt.*; +// Класс отрисовки двигателей +public class DrawningEngine { + private Engine _engine; + public void setCodeEngine(int code){ + _engine = Engine.getByCode(code); + } + // Отрисовка двигателей + public void DrawEngine(Graphics g, int startX, int startY, Color _bodyColor){ + if(_engine.getEngineCode() >= 2) { + g.setColor(_bodyColor); + g.fillRect(startX+ 30, startY + 15, 13, 5); + g.fillRect(startX+ 30, startY + 50, 13, 5); + g.setColor(Color.BLACK); + g.drawRect(startX+ 30, startY + 15, 13, 5); + g.drawRect(startX+ 30, startY + 50, 13, 5); + } + if(_engine.getEngineCode() >= 4){ + g.setColor(_bodyColor); + g.fillRect(startX+ 30, startY + 22, 13, 5); + g.fillRect(startX+ 30, startY + 43, 13, 5); + g.setColor(Color.BLACK); + g.drawRect(startX+ 30, startY + 22, 13, 5); + g.drawRect(startX+ 30, startY + 43, 13, 5); + } + if(_engine.getEngineCode() >= 6){ + g.setColor(_bodyColor); + g.fillRect(startX+ 30, startY + 8, 13, 5); + g.fillRect(startX+ 30, startY + 57, 13, 5); + g.setColor(Color.BLACK); + g.drawRect(startX+ 30, startY + 8, 13, 5); + g.drawRect(startX+ 30, startY + 57, 13, 5); + } + } +} \ No newline at end of file diff --git a/AirFighter/src/Engine.java b/AirFighter/src/Engine.java new file mode 100644 index 0000000..87a6bf0 --- /dev/null +++ b/AirFighter/src/Engine.java @@ -0,0 +1,21 @@ +// Количество двигателей +public enum Engine { + TwoEngine(2), + FourEngine(4), + SixEngine(6), + UNKNOWN(0) + ; + private final int engineCode; + Engine(int engineCode) { + this.engineCode = engineCode; + } + public int getEngineCode() { + return this.engineCode; + } + public static Engine getByCode(int code) { + for(Engine e : values()) { + if(e.engineCode == code) return e; + } + return UNKNOWN; + } +} diff --git a/AirFighter/src/EntityAirFighter.java b/AirFighter/src/EntityAirFighter.java new file mode 100644 index 0000000..e2d92c2 --- /dev/null +++ b/AirFighter/src/EntityAirFighter.java @@ -0,0 +1,29 @@ +import java.awt.*; + +public class EntityAirFighter { + // Скорость + private int Speed; + // Вес + private float Weight; + // Цвет корпуса + private Color BodyColor; + // Шаг + public float Step() { + return Speed * 150 / Weight; + } + public void Init(int _speed, float _weight, Color _bodyColor){ + Speed = _speed; + Weight = _weight; + BodyColor = _bodyColor; + } + public int getSpeed(){ + return Speed; + } + public float getWeight(){ + return Weight; + } + public Color getBodyColor(){ + return BodyColor; + } +} + diff --git a/AirFighter/src/FormAirFighter.java b/AirFighter/src/FormAirFighter.java new file mode 100644 index 0000000..bb38648 --- /dev/null +++ b/AirFighter/src/FormAirFighter.java @@ -0,0 +1,222 @@ +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +// Класс отображения формы +public class FormAirFighter extends JFrame implements ComponentListener{ + private JPanel panelForDrawing; + private JPanel statusLabel = new JPanel(); + private JButton buttonUp; + private JButton buttonDown; + private JButton buttonLeft; + private JButton buttonRight; + private String item = "2"; + private DrawningAirFighter _airFighter; + + // Слушатель кнопки направления + private ActionListener actionListenerDirection = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(_airFighter == null){ + return; + } + if (e.getActionCommand() == Direction.Up.name()){ + _airFighter.MoveTransport(Direction.Up); + }else if (e.getActionCommand() == Direction.Down.name()){ + _airFighter.MoveTransport(Direction.Down); + }else if (e.getActionCommand() == Direction.Left.name()){ + _airFighter.MoveTransport(Direction.Left); + }else if (e.getActionCommand() == Direction.Right.name()){ + _airFighter.MoveTransport(Direction.Right); + } + panelForDrawing.repaint(); + } + }; + public FormAirFighter(){ + super("Военный самолет"); + // Panel для отрисовки + panelForDrawing = new JPanel(){ + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + try { + _airFighter.DrawTransport(g); + }catch (Exception e){} + } + }; + panelForDrawing.setLayout(new BorderLayout()); + panelForDrawing.setSize(getWidth(), getHeight()); + setContentPane(panelForDrawing); + // statusLabel + JLabel labelSpeed = new JLabel("Скорость:"); + JLabel labelWeight = new JLabel("Вес:"); + JLabel labelBodyColor = new JLabel("Цвет:"); + statusLabel.add(labelSpeed); + statusLabel.add(labelWeight); + statusLabel.add(labelBodyColor); + statusLabel.setLayout(new FlowLayout(FlowLayout.LEFT)); + statusLabel.setSize(new Dimension(getWidth(), 30)); + // Кнопка создания + JButton buttonCreate = new JButton("Создать"); + buttonCreate.setSize(100, 25); + buttonCreate.setLayout(new FlowLayout(FlowLayout.LEFT)); + buttonCreate.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + _airFighter = new DrawningAirFighter(); + _airFighter.Init((int)(Math.random() * 300 + 200),(int)(Math.random() * 3000 + 2000), new Color((int)(Math.random() * 255), (int)(Math.random() * 255), (int)(Math.random() * 255)), Integer.parseInt(item)); + _airFighter.SetPosition((int)(Math.random() * 100 + 10), (int)(Math.random() * 100 + 10), panelForDrawing.getWidth(), panelForDrawing.getHeight()); + labelSpeed.setText("Скорость: " + _airFighter.AirFighter.getSpeed()); + labelWeight.setText("Вес: " + _airFighter.AirFighter.getWeight()); + labelBodyColor.setText("Цвет: " + _airFighter.AirFighter.getBodyColor()); + panelForDrawing.repaint(); + } + }); + // Контейнер кнопок и панели с информацией + Container container = new Container(); + container.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.weightx = 10; + constraints.weighty = 10; + + constraints.anchor = GridBagConstraints.WEST; + constraints.gridwidth = 1; + constraints.gridx = 0; + constraints.gridy = 0; + container.add(buttonCreate, constraints); + + constraints.anchor = GridBagConstraints.WEST; + constraints.gridx = 0; + constraints.gridy = 1; + container.add(statusLabel, constraints); + + constraints.anchor = GridBagConstraints.WEST; + constraints.gridx = 1; + constraints.gridy = 1; + String[] _engine = { + "2", + "4", + "6" + }; + JComboBox editComboBox = new JComboBox(_engine); + editComboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JComboBox box = (JComboBox)e.getSource(); + item = (String)box.getSelectedItem(); + } + }); + editComboBox.setEditable(true); + container.add(editComboBox, constraints); + // Контейнер с кнопками движения + Container containerDirection = new Container(); + containerDirection.setPreferredSize(new Dimension(120, 70)); + containerDirection.setLayout(new GridBagLayout()); + GridBagConstraints constraintsDirection = new GridBagConstraints(); + constraintsDirection.weightx = 40; + constraintsDirection.weighty = 40; + constraintsDirection.gridwidth = 2; + constraintsDirection.gridheight = 1; + // Кнопка Up + try { + BufferedImage bufferedImage = ImageIO.read(new File("AirFighter/Images/Up.png")); + Image imageUp = bufferedImage.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + ImageIcon iconUp = new ImageIcon(imageUp); + buttonUp = new JButton(iconUp); + buttonUp.setPreferredSize(new Dimension(30, 30)); + buttonUp.setContentAreaFilled(false); + buttonUp.setBorderPainted(false); + buttonUp.setActionCommand(Direction.Up.name()); + buttonUp.addActionListener(actionListenerDirection); + constraintsDirection.gridx = 1; + constraintsDirection.gridy = 0; + containerDirection.add(buttonUp, constraintsDirection); + }catch (IOException e){} + // Кнопка Down + try { + BufferedImage bufferedImage = ImageIO.read(new File("AirFighter/Images/Down.png")); + Image imageDown = bufferedImage.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + ImageIcon iconDown = new ImageIcon(imageDown); + buttonDown = new JButton(iconDown); + buttonDown.setActionCommand(Direction.Down.name()); + buttonDown.addActionListener(actionListenerDirection); + buttonDown.setPreferredSize(new Dimension(30, 30)); + buttonDown.setContentAreaFilled(false); + buttonDown.setBorderPainted(false); + constraintsDirection.gridx = 1; + constraintsDirection.gridy = 1; + containerDirection.add(buttonDown, constraintsDirection); + }catch (IOException e){} + // Кнопка Left + try { + BufferedImage bufferedImage = ImageIO.read(new File("AirFighter/Images/Left.png")); + Image imageLeft = bufferedImage.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + ImageIcon iconLeft = new ImageIcon(imageLeft); + buttonLeft = new JButton(iconLeft); + buttonLeft.setActionCommand(Direction.Left.name()); + buttonLeft.addActionListener(actionListenerDirection); + buttonLeft.setPreferredSize(new Dimension(30, 30)); + buttonLeft.setContentAreaFilled(false); + buttonLeft.setBorderPainted(false); + constraintsDirection.fill = GridBagConstraints.WEST; + constraintsDirection.gridx = 0; + containerDirection.add(buttonLeft, constraintsDirection); + }catch (IOException e){} + // Кнопка Right + try { + BufferedImage bufferedImage = ImageIO.read(new File("AirFighter/Images/Right.png")); + Image imageRight = bufferedImage.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + ImageIcon iconRight = new ImageIcon(imageRight); + buttonRight = new JButton(iconRight); + buttonRight.setActionCommand(Direction.Right.name()); + buttonRight.addActionListener(actionListenerDirection); + buttonRight.setPreferredSize(new Dimension(30, 30)); + buttonRight.setContentAreaFilled(false); + buttonRight.setBorderPainted(false); + constraintsDirection.fill = GridBagConstraints.EAST; + constraintsDirection.gridx = 2; + containerDirection.add(buttonRight, constraintsDirection); + }catch (IOException e){} + + constraints.anchor = GridBagConstraints.EAST; + constraints.gridx = 1; + constraints.gridy = 0; + container.add(containerDirection, constraints); + + add(container, BorderLayout.SOUTH); + } + + public static void main(String[] args) { + // Создание формы + FormAirFighter _formAirFighter = new FormAirFighter(); + _formAirFighter.addComponentListener(_formAirFighter); + _formAirFighter.setSize (600,400); + _formAirFighter.getRootPane().setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); + _formAirFighter.addWindowListener (new WindowAdapter () { + public void windowClosing (WindowEvent e) { + e.getWindow ().dispose (); + } + }); + _formAirFighter.setVisible(true); + } + // Слушатель изменения размера окна + @Override + public void componentResized(ComponentEvent e) { + try { + _airFighter.ChangeBorders(panelForDrawing.getWidth(), panelForDrawing.getHeight()); + panelForDrawing.repaint(); + }catch (Exception eo){} + } + @Override + public void componentMoved(ComponentEvent e) { + } + @Override + public void componentShown(ComponentEvent e) { + } + @Override + public void componentHidden(ComponentEvent e) { + } +} diff --git a/AirFighter/src/Main.java b/AirFighter/src/Main.java deleted file mode 100644 index 3e59c38..0000000 --- a/AirFighter/src/Main.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file