diff --git a/src/AirBomber/BomberForm.java b/src/AirBomber/BomberForm.java index cab4ef6..398ca28 100644 --- a/src/AirBomber/BomberForm.java +++ b/src/AirBomber/BomberForm.java @@ -13,9 +13,13 @@ public class BomberForm extends JFrame private BomberRendererBase _bomberRenderer; private AbstractStrategy _strategy; + public BomberRendererBase GetSelectedRenderer() { return _bomberRenderer; } + public BomberForm() { InitializeComponent(); + + _strategy = null; } private void Draw() @@ -38,11 +42,28 @@ public class BomberForm extends JFrame { Random random = new Random(); + Color BodyColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + Color AdditionalColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + + JColorChooser BodyColorPicker = new JColorChooser(Color.BLACK); + if (JOptionPane.showConfirmDialog(null, BodyColorPicker, "Выберите цвет", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) + == JOptionPane.OK_OPTION) + { + BodyColor = BodyColorPicker.getColor(); + } + + JColorChooser AdditionalColorPicker = new JColorChooser(Color.BLACK); + if (JOptionPane.showConfirmDialog(null, AdditionalColorPicker, "Выберите цвет", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) + == JOptionPane.OK_OPTION) + { + AdditionalColor = AdditionalColorPicker.getColor(); + } + _bomberRenderer = new BomberRenderer( random.nextInt(100, 300), random.nextInt(1000, 3000), - new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), - new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), + BodyColor, + AdditionalColor, true, true, BomberPictureBox.getWidth(), @@ -58,10 +79,19 @@ public class BomberForm extends JFrame { Random random = new Random(); + Color BodyColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + + JColorChooser BodyColorPicker = new JColorChooser(Color.BLACK); + if (JOptionPane.showConfirmDialog(null, BodyColorPicker, "Выберите цвет", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) + == JOptionPane.OK_OPTION) + { + BodyColor = BodyColorPicker.getColor(); + } + _bomberRenderer = new BomberRendererBase( random.nextInt(100, 300), random.nextInt(1000, 3000), - new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)), + BodyColor, BomberPictureBox.getWidth(), BomberPictureBox.getHeight() ); @@ -96,17 +126,17 @@ public class BomberForm extends JFrame return; _strategy.SetData( - new ObjectEntityRenderer(_bomberRenderer), + _bomberRenderer.MovableObject(), BomberPictureBox.getWidth(), BomberPictureBox.getHeight() ); - - MovementStrategyComboBox.setEnabled(false); } if (_strategy == null) return; + MovementStrategyComboBox.setEnabled(false); + _strategy.MakeStep(); Draw(); @@ -157,6 +187,7 @@ public class BomberForm extends JFrame MovementStrategyComboBox = new JComboBox(); ButtonCreateBomber = new JButton(); ButtonPerformMove = new JButton(); + SelectBomberButton = new JButton(); // // BomberPictureBox // @@ -238,14 +269,23 @@ public class BomberForm extends JFrame ButtonPerformMove.setFocusable(false); ButtonPerformMove.addActionListener(e -> ButtonPerformStep_Click(e)); // + // SelectBomberButton + // + SelectBomberButton.setBounds(354, 407, 159, 42); + SelectBomberButton.setName("SelectBomberButton"); + SelectBomberButton.setText("Выбрать бомбардировщик"); + SelectBomberButton.setBackground(new Color(225, 225, 225)); + SelectBomberButton.setFont(new Font("Segoe UI", Font.PLAIN, 11)); + SelectBomberButton.setFocusable(false); + // // BomberForm // setTitle("Бомбардировщик"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(900, 500); setLayout(null); setLocationRelativeTo(null); setVisible(true); + add(SelectBomberButton); add(ButtonPerformMove); add(ButtonCreateBomber); add(MovementStrategyComboBox); @@ -266,4 +306,5 @@ public class BomberForm extends JFrame private JComboBox MovementStrategyComboBox; private JButton ButtonCreateBomber; private JButton ButtonPerformMove; + public JButton SelectBomberButton; } diff --git a/src/AirBomber/FormArrays.java b/src/AirBomber/FormArrays.java new file mode 100644 index 0000000..07be14c --- /dev/null +++ b/src/AirBomber/FormArrays.java @@ -0,0 +1,114 @@ +package AirBomber; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.image.BufferedImage; +import java.util.Random; + +import AirBomber.Entities.*; +import AirBomber.Generics.*; +import AirBomber.Rendering.*; + +public class FormArrays extends JFrame +{ + private ArraysGeneric Arrays; + + public FormArrays() + { + InitializeComponent(); + + Random Random = new Random(); + int MaxCount = Random.nextInt(2, 4); + + Arrays = new ArraysGeneric<>(MaxCount, MaxCount, PictureBox.getWidth(), PictureBox.getHeight()); + + for (int i = 0; i < MaxCount; i++) + { + /** Добавление сущности */ + Arrays.Add(new BomberEntityBase( + Random.nextInt(100, 300), + Random.nextInt(1000, 3000), + new Color(Random.nextInt(0, 256), Random.nextInt(0, 256), Random.nextInt(0, 256)) + )); + + /** Добавление IEngineRenderer */ + IEngineRenderer EngineRenderer = null; + + int EngineRendererVariant = Random.nextInt(1, 4); + switch (EngineRendererVariant) { + case 1: + EngineRenderer = new EngineRenderer(); + break; + + case 2: + EngineRenderer = new RectangleEngineRenderer(); + break; + + case 3: + EngineRenderer = new TriangleEngineRenderer(); + break; + + default: + break; + } + + EngineRenderer.SetAmount(Random.nextInt(1, 7)); + Arrays.Add(EngineRenderer); + } + } + + private void Draw(BomberRendererBase Renderer) + { + BufferedImage bmp = new BufferedImage( + PictureBox.getWidth(), + PictureBox.getHeight(), + BufferedImage.TYPE_INT_ARGB + ); + Graphics2D g = bmp.createGraphics(); + Renderer.DrawEntity(g); + + PictureBox.setIcon(new ImageIcon(bmp)); + } + + private void ButtonCreate_Click(ActionEvent e) + { + BomberRendererBase Renderer = Arrays.CreateObject(); + + Renderer.SetPosition(100, 100); + Draw(Renderer); + } + + private void InitializeComponent() + { + PictureBox = new JLabel(); + ButtonCreate = new JButton(); + // + // ButtonCreate + // + ButtonCreate.setName("ButtonCreate"); + ButtonCreate.setBounds(12, 419, 80, 30); + ButtonCreate.setText("Создать"); + ButtonCreate.setBackground(new Color(225, 225, 225)); + ButtonCreate.setFont(new Font("Segoe UI", Font.PLAIN, 11)); + ButtonCreate.setFocusable(false); + ButtonCreate.addActionListener(e -> ButtonCreate_Click(e)); + // + // PictureBox + // + PictureBox.setBounds(0, 0, 884, 461); + // + // BomberForm + // + setTitle("Усложнение"); + setSize(900, 500); + setLayout(null); + setLocationRelativeTo(null); + setVisible(true); + add(PictureBox); + add(ButtonCreate); + } + + private JButton ButtonCreate; + private JLabel PictureBox; +} diff --git a/src/AirBomber/FormEntityCollection.java b/src/AirBomber/FormEntityCollection.java new file mode 100644 index 0000000..cc1e032 --- /dev/null +++ b/src/AirBomber/FormEntityCollection.java @@ -0,0 +1,148 @@ +package AirBomber; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import AirBomber.Generics.EntitiesGenericCollection; +import AirBomber.MovementStrategy.ObjectEntityRenderer; +import AirBomber.Rendering.BomberRendererBase; + +public class FormEntityCollection extends JFrame +{ + private final EntitiesGenericCollection _entities; + + public FormEntityCollection() + { + InitializeComponent(); + + _entities = new EntitiesGenericCollection( + CollectionPictureBox.getWidth(), CollectionPictureBox.getHeight() + ); + } + + public void ButtonAddEntity_Click(ActionEvent e) + { + BomberForm Form = new BomberForm(); + + Form.SelectBomberButton.addActionListener(e2 -> { + if (_entities.Add(Form.GetSelectedRenderer()) != -1) + { + JOptionPane.showMessageDialog(null, "Объект добавлен"); + CollectionPictureBox.setIcon(new ImageIcon(_entities.ShowEntities())); + } + else + { + JOptionPane.showMessageDialog(null, "Не удалось добавить объект"); + } + + Form.dispose(); + }); + } + + public void ButtonRemoveEntity_Click(ActionEvent e) + { + int Pos; + try + { + Pos = Integer.parseInt(NumberMaskedTextBox.getText()); + } + catch (Exception ex) + { + JOptionPane.showMessageDialog(null, "Некорректный ввод"); + return; + } + + if (_entities.Remove(Pos) == true) + { + JOptionPane.showMessageDialog(null, "Объект удален"); + CollectionPictureBox.setIcon(new ImageIcon(_entities.ShowEntities())); + } + else + { + JOptionPane.showMessageDialog(null, "Не удалось удалить объект"); + } + } + + public void ButtonRefreshCollection_Click(ActionEvent e) + { + CollectionPictureBox.setIcon(new ImageIcon(_entities.ShowEntities())); + } + + private void InitializeComponent() + { + CollectionPictureBox = new JLabel(); + ToolGroupBox = new JPanel(); + RefreshCollectionButton = new JButton(); + RemoveBomberButton = new JButton(); + NumberMaskedTextBox = new JTextField(); + AddBomberButton = new JButton(); + // + // CollectionPictureBox + // + CollectionPictureBox.setBounds(0, 0, 812, 603); + // + // ToolGroupBox + // + ToolGroupBox.add(RefreshCollectionButton); + ToolGroupBox.add(RemoveBomberButton); + ToolGroupBox.add(NumberMaskedTextBox); + ToolGroupBox.add(AddBomberButton); + ToolGroupBox.setBounds(818, 12, 210, 545); + ToolGroupBox.setName("ToolGroupBox"); + ToolGroupBox.setBorder(BorderFactory.createTitledBorder("Инструменты")); + ToolGroupBox.setLayout(null); + // + // RefreshCollectionButton + // + RefreshCollectionButton.setBounds(10, 190, 190, 30); + RefreshCollectionButton.setName("RefreshCollectionButton"); + RefreshCollectionButton.setText("Обновить коллекцию"); + RefreshCollectionButton.setBackground(new Color(225, 225, 225)); + RefreshCollectionButton.setFont(new Font("Segoe UI", Font.PLAIN, 11)); + RefreshCollectionButton.setFocusable(false); + RefreshCollectionButton.addActionListener(e -> ButtonRefreshCollection_Click(e)); + // + // RemoveBomberButton + // + RemoveBomberButton.setBounds(10, 141, 190, 30); + RemoveBomberButton.setName("RemoveBomberButton"); + RemoveBomberButton.setText("Удалить бомбардировщик"); + RemoveBomberButton.setBackground(new Color(225, 225, 225)); + RemoveBomberButton.setFont(new Font("Segoe UI", Font.PLAIN, 11)); + RemoveBomberButton.setFocusable(false); + RemoveBomberButton.addActionListener(e -> ButtonRemoveEntity_Click(e)); + // + // NumberMaskedTextBox + // + NumberMaskedTextBox.setBounds(10, 102, 190, 23); + NumberMaskedTextBox.setName("NumberMaskedTextBox"); + // + // AddBomberButton + // + AddBomberButton.setBounds(10, 32, 190, 43); + AddBomberButton.setName("AddBomberButton"); + AddBomberButton.setText("Добавить бомбардировщик"); + AddBomberButton.setBackground(new Color(225, 225, 225)); + AddBomberButton.setFont(new Font("Segoe UI", Font.PLAIN, 11)); + AddBomberButton.setFocusable(false); + AddBomberButton.addActionListener(e -> ButtonAddEntity_Click(e)); + // + // FormEntityCollection + // + setTitle("Набор бомбардировщиков"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(1050, 603); + setLayout(null); + setLocationRelativeTo(null); + setVisible(true); + add(ToolGroupBox); + add(CollectionPictureBox); + } + + private JLabel CollectionPictureBox; + private JPanel ToolGroupBox; + private JButton RefreshCollectionButton; + private JButton RemoveBomberButton; + private JTextField NumberMaskedTextBox; + private JButton AddBomberButton; +} diff --git a/src/AirBomber/Generics/ArraysGeneric.java b/src/AirBomber/Generics/ArraysGeneric.java new file mode 100644 index 0000000..f4c4f38 --- /dev/null +++ b/src/AirBomber/Generics/ArraysGeneric.java @@ -0,0 +1,68 @@ +package AirBomber.Generics; + +import AirBomber.Entities.*; +import AirBomber.Rendering.*; +import java.util.ArrayList; +import java.util.Random; + +public class ArraysGeneric +{ + private ArrayList _entities; + private ArrayList _renderers; + + private int _entitiesCount = 0; + private int _renderersCount = 0; + + private final int _entitiesMaxCount; + private final int _renderersMaxCount; + + private final int _pictureWidth; + private final int _pictureHeight; + + public ArraysGeneric(int EntitiesMaxCount, int RenderersMaxCount, int Width, int Height) + { + _entitiesMaxCount = EntitiesMaxCount; + _renderersMaxCount = RenderersMaxCount; + + _entities = new ArrayList(EntitiesMaxCount); + _renderers = new ArrayList(RenderersMaxCount); + + _pictureWidth = Width; + _pictureHeight = Height; + } + + /** Полиморфные методы */ + public boolean Add(T Entity) + { + if (Entity == null || _entitiesCount >= _entitiesMaxCount) + return false; + + _entities.add(_entitiesCount++, Entity); + return true; + } + + public boolean Add(U Renderer) + { + if (Renderer == null || _renderersCount >= _renderersMaxCount) + return false; + + _renderers.add(_renderersCount++, Renderer); + return true; + } + + public BomberRendererBase CreateObject() + { + if (_entitiesCount == 0 || _renderersCount == 0) + return null; + + Random Random = new Random(); + + int EntityIndex = Random.nextInt(_entitiesCount); + int EngineRendererIndex = Random.nextInt(_renderersCount); + + T Entity = _entities.get(EntityIndex); + U EngineRenderer = _renderers.get(EngineRendererIndex); + + return new BomberRendererBase(Entity, EngineRenderer, _pictureWidth, _pictureHeight); + } +} diff --git a/src/AirBomber/Generics/EntitiesGenericCollection.java b/src/AirBomber/Generics/EntitiesGenericCollection.java new file mode 100644 index 0000000..eb6098c --- /dev/null +++ b/src/AirBomber/Generics/EntitiesGenericCollection.java @@ -0,0 +1,105 @@ +package AirBomber.Generics; + +import java.awt.*; +import java.awt.image.BufferedImage; +import AirBomber.MovementStrategy.IMovableObject; +import AirBomber.Rendering.BomberRendererBase; + +public class EntitiesGenericCollection +{ + private final int _pictureWidth; + private final int _pictureHeight; + + private final int _placeSizeWidth = 200; + private final int _placeSizeHeight = 200; + + private final SetGeneric _collection; + + public EntitiesGenericCollection(int PictureWidth, int PictureHeight) + { + int width = PictureWidth / _placeSizeWidth; + int height = PictureHeight / _placeSizeHeight; + + _pictureWidth = PictureWidth; + _pictureHeight = PictureHeight; + + _collection = new SetGeneric(width * height); + } + + public int Add(T obj) + { + if (obj == null) + return -1; + + return _collection.Insert(obj); + } + + public boolean Remove(int pos) + { + T obj = _collection.Get(pos); + + if (obj != null) + return _collection.Remove(pos); + + return false; + } + + @SuppressWarnings("unchecked") + public U GetU(int pos) + { + return (U)_collection.Get(pos).MovableObject(); + } + + public BufferedImage ShowEntities() + { + BufferedImage bmp = new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D gr = bmp.createGraphics(); + + DrawBackground(gr); + DrawObjects(gr); + + return bmp; + } + + private void DrawBackground(Graphics2D g) + { + g.setColor(Color.BLACK); + g.setStroke(new BasicStroke(3)); + + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + { + for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + g.drawLine( + i * _placeSizeWidth, j * _placeSizeHeight, + i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight + ); + + g.drawLine( + i * _placeSizeWidth, 0, + i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight + ); + } + } + + private void DrawObjects(Graphics2D g) + { + g.setStroke(new BasicStroke(1)); + + for (int i = 0; i < _collection.Count(); i++) + { + T Entity = _collection.Get(i); + + if (Entity == null) + continue; + + /** Установка позиции */ + int NumX = _pictureWidth / _placeSizeWidth; + + int PosX = (NumX - 1 - i % NumX) * _placeSizeWidth; + int PosY = (i / NumX) * _placeSizeHeight; + + Entity.SetPosition(PosX, PosY); + Entity.DrawEntity(g); + } + } +} diff --git a/src/AirBomber/Generics/SetGeneric.java b/src/AirBomber/Generics/SetGeneric.java new file mode 100644 index 0000000..eb296b9 --- /dev/null +++ b/src/AirBomber/Generics/SetGeneric.java @@ -0,0 +1,64 @@ +package AirBomber.Generics; + +public class SetGeneric +{ + private final T[] _objects; + + public int Count() { return _objects.length; } + + @SuppressWarnings("unchecked") + public SetGeneric(int Count) + { + _objects = (T[]) new Object[Count]; + } + + public int Insert(T Entity) + { + return Insert(Entity, 0); + } + + public int Insert(T Entity, int Pos) + { + if (Pos >= Count() || Pos < 0) + return -1; + + if (_objects[Pos] == null) + { + _objects[Pos] = Entity; + return Pos; + } + + /** Сдвиг элементов вправо начиная с Pos до ближайшего пустого места */ + int EmptyPos = -1; + + for (int i = Pos + 1; i < Count(); i++) + if (_objects[i] == null) + { + EmptyPos = i; + break; + } + + if (EmptyPos == -1) + return -1; + + _objects[EmptyPos] = Entity; + return EmptyPos; + } + + public boolean Remove(int Pos) + { + if (Pos >= Count()) + return false; + + _objects[Pos] = null; + return true; + } + + public T Get(int Pos) + { + if (Pos >= Count()) + return null; + + return _objects[Pos]; + } +} diff --git a/src/AirBomber/Program.java b/src/AirBomber/Program.java index 9f3a993..a7088b0 100644 --- a/src/AirBomber/Program.java +++ b/src/AirBomber/Program.java @@ -3,6 +3,6 @@ package AirBomber; public class Program { public static void main(String[] args) throws Exception { - new BomberForm(); + new FormArrays(); } } diff --git a/src/AirBomber/Rendering/BomberRendererBase.java b/src/AirBomber/Rendering/BomberRendererBase.java index d39701f..9f29088 100644 --- a/src/AirBomber/Rendering/BomberRendererBase.java +++ b/src/AirBomber/Rendering/BomberRendererBase.java @@ -26,6 +26,8 @@ public class BomberRendererBase public int EntityWidth() { return _bomberWidth; } public int EntityHeight() { return _bomberHeight; } + public IMovableObject MovableObject() { return new ObjectEntityRenderer(this); } + public BomberRendererBase(int Speed, double Weight, Color BodyColor, int Width, int Height) { if (Width < _bomberWidth || Height < _bomberHeight) @@ -97,6 +99,21 @@ public class BomberRendererBase EngineRenderer.SetAmount(Random.nextInt(1, 7)); } + public BomberRendererBase(BomberEntityBase Entity, IEngineRenderer EngineRenderer, int Width, int Height) + { + if (Width < _bomberWidth || Height < _bomberHeight) + return; + + _startPosX = 0; + _startPosY = 0; + + _pictureWidth = Width; + _pictureHeight = Height; + + this.EntityBomber = Entity; + this.EngineRenderer = EngineRenderer; + } + public BomberEntityBase GetEntityBomber() { return EntityBomber; } public void SetPosition(int x, int y)