using ProjectTank.DrawningObjects; using ProjectTank.MovementStrategy; namespace ProjectTank.Generics { /// /// Параметризованный класс для набора объектов DrawningCar /// /// /// internal class TanksGenericCollection where T : DrawningTankBase where U : IMoveableObject { /// /// Ширина окна прорисовки /// private readonly int _pictureWidth; /// /// Высота окна прорисовки /// private readonly int _pictureHeight; /// /// Размер занимаемого объектом места (ширина) /// private readonly int _placeSizeWidth = 150; /// /// Размер занимаемого объектом места (высота) /// private readonly int _placeSizeHeight = 100; /// /// Набор объектов /// private readonly SetGeneric _collection; /// /// Конструктор /// /// /// public TanksGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; _pictureWidth = picWidth; _pictureHeight = picHeight; _collection = new SetGeneric(width * height); } /// /// Перегрузка оператора сложения /// /// /// /// public static int operator +(TanksGenericCollection collect, T? obj) { if (obj == null) return -1; return collect?._collection.Insert(obj) ?? -1; } /// /// Перегрузка оператора вычитания /// /// /// /// public static bool operator -(TanksGenericCollection collect, int pos) { T? obj = collect._collection.Get(pos); if (obj != null) return collect._collection.Remove(pos); return false; } /// /// Получение объекта IMoveableObject /// /// /// public U? GetU(int pos) { return (U?)_collection.Get(pos)?.GetMoveableObject; } /// /// Вывод всего набора объектов /// /// public Bitmap ShowTanks() { Bitmap bmp = new(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); DrawBackground(gr); DrawObjects(gr); return bmp; } /// /// Метод отрисовки фона /// /// private void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) { for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) { //линия рамзетки места g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); } g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); } } /// /// Метод прорисовки объектов /// /// private void DrawObjects(Graphics g) { for (int i = 0; i < _collection.Count; i++) { DrawningTankBase tank = _collection.Get(i); if (tank != null) { int columnsCount = _pictureHeight / _placeSizeHeight + 1; int colIndex = i % columnsCount; int rowIndex = i / columnsCount; tank.SetPosition(colIndex * _placeSizeWidth + 2, rowIndex * _placeSizeHeight + 2); tank.DrawTransport(g); } } } } }