using Liner.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Liner.Drawing { public class DrawingBigLiner : DrawingLiner { /// /// Конструктор /// /// Скорость /// Вес лайнера /// Основной цвет /// Признак наличия бассейна /// Признак наличия доп палубы /// Ширина картинки /// Высота картинки public DrawingBigLiner(int speed, double weight, Color bodyColor, Color bottomColor, bool swimmingPool, bool deck, int width, int height) : base(speed,weight,bodyColor,bottomColor,width,height,100,80) { if(EntityLiner!= null) { EntityLiner = new EntityBigLiner(speed, weight, bodyColor, bottomColor, deck, swimmingPool); } } /// /// Прорисовка объекта /// /// // высота палубы - 20 пикселей public override void DrawTransport(Graphics g) { if (EntityLiner is not EntityBigLiner liner) { return; } Pen pen = new(Color.Black); Brush poolBrush = new SolidBrush(Color.Blue); Brush bottomBrush = new SolidBrush(EntityLiner.BottomColor); Brush deckBrush = new SolidBrush(EntityLiner.BodyColor); // палуба Point[] firstDeck = {new Point(_startPosX + 30, _startPosY), new Point(_startPosX + 30 + 60, _startPosY), new Point(_startPosX + 30 + 60, _startPosY + 20), new Point(_startPosX + 30, _startPosY + 20)}; int addY = 20; // нижний корпус Point[] bottom = {new Point(_startPosX, _startPosY), new Point(_startPosX + 100, _startPosY), new Point(_startPosX+80, _startPosY + 40), new Point(_startPosX + 20, _startPosY + 40)}; // бассейн Point[] pool = {new Point(_startPosX + 10, _startPosY), new Point(_startPosX + 30, _startPosY), new Point(_startPosX+30, _startPosY + 10), new Point(_startPosX + 10, _startPosY + 10)}; g.FillPolygon(deckBrush, firstDeck); g.DrawPolygon(pen, firstDeck);//рисуем палубу Point[] currentDeck = new Point[4]; //буффер для прорисовки доп палуб firstDeck.CopyTo(currentDeck, 0); if (liner.Deck) //рисуем вторую палубу { for (int i = 0; i < 4; i++) { currentDeck[i].Y += addY; } g.FillPolygon(deckBrush, currentDeck); g.DrawPolygon(pen, currentDeck); addY += 20; } for (int i = 0; i < 4; i++) //сдвигаем элементы вниз на кол-во палуб { bottom[i].Y += addY; pool[i].Y += addY; } g.FillPolygon(bottomBrush, bottom); g.DrawPolygon(pen, bottom);//рисуем нижний корпус if (liner.SwimmingPool) { g.FillPolygon(poolBrush, pool); }//рисуем бассейн g.Dispose(); } } }