2023-11-11 20:29:38 +03:00

228 lines
9.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trolleybus.Entities;
using Trolleybus.MovementStrategy;
namespace Trolleybus.DrawingObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingBus
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBus? EntityBus { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки автобуса
/// </summary>
protected int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки автобуса
/// </summary>
protected int _startPosY;
/// <summary>
/// Ширина прорисовки автобуса
/// </summary>
protected readonly int _busWidth = 150;
/// <summary>
/// Высота прорисовки автобуса
/// </summary>
protected readonly int _busHeight = 95;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _busWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _busHeight;
/// <summary>
/// Получение объекта IMoveableObject из объекта DrawningBus
/// </summary>
public IMoveableObject GetMoveableObject => new DrawingObjectBus(this);
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawingBus(int speed, double weight, Color bodyColor, int width, int height)
{
if (width < _busWidth || height < _busHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
EntityBus = new EntityBus(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="busWidth">Ширина прорисовки автобуса</param>
/// <param name="busHeight">Высота прорисовки автобус</param>
protected DrawingBus(int speed, double weight, Color bodyColor, int width, int height, int busWidth, int busHeight)
{
if (width < _busWidth || height < _busHeight)
{
return;
}
_pictureWidth = width;
_pictureHeight = height;
_busWidth = busWidth;
_busHeight = busHeight;
EntityBus = new EntityBus(speed, weight, bodyColor);
}
//Метод для того, чтобы изменить размеры окна, т.к. pictureBoxObject в FormBusConfig и pictureBoxCollection в FormBusesCollection
//имеют разные размеры, из-за чего объекты некорректно отрисовываются в FormBusesCollection после FormBusConfig
public void ChangePictureSize(int width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
_startPosX = Math.Min(Math.Max(x, 0), _pictureWidth - _busWidth);
_startPosY = Math.Min(Math.Max(y, 0), _pictureHeight - _busHeight);
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityBus == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - EntityBus.Step > 0)
{
_startPosX -= (int)EntityBus.Step;
}
break;
//вверх
case DirectionType.Up:
if (_startPosY - EntityBus.Step > 0)
{
_startPosY -= (int)EntityBus.Step;
}
break;
// вправо
case DirectionType.Right:
if (_startPosX + _busWidth + EntityBus.Step < _pictureWidth)
{
_startPosX += (int)EntityBus.Step;
}
break;
//вниз
case DirectionType.Down:
if (_startPosY + _busHeight + EntityBus.Step < _pictureHeight)
{
_startPosY += (int)EntityBus.Step;
}
break;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
Pen pen = new(Color.Black); //чёрный цвет для колёс
Pen bodyPen = new(EntityBus.BodyColor);
Pen windowPen = new(Color.Cyan); //цвет окон
//РИСОВАНИЕ САМОГО АВТОБУСА
//корпус
g.DrawLine(bodyPen, _startPosX, _startPosY + 30, _startPosX, _startPosY + 80);
g.DrawLine(bodyPen, _startPosX, _startPosY + 80, _startPosX + 20, _startPosY + 80);
g.DrawLine(bodyPen, _startPosX + 45, _startPosY + 80, _startPosX + 105, _startPosY + 80);
g.DrawLine(bodyPen, _startPosX + 130, _startPosY + 80, _startPosX + 150, _startPosY + 80);
g.DrawLine(bodyPen, _startPosX + 150, _startPosY + 80, _startPosX + 150, _startPosY + 30);
g.DrawLine(bodyPen, _startPosX + 150, _startPosY + 30, _startPosX, _startPosY + 30);
//колёса
g.DrawEllipse(pen, _startPosX + 20, _startPosY + 70, 25, 25);
g.DrawEllipse(pen, _startPosX + 105, _startPosY + 70, 25, 25);
//дверь
g.DrawRectangle(bodyPen, _startPosX + 55, _startPosY + 50, 15, 30);
//окна
//окна до двери
for (int i = 0; i < 2; i++)
{
g.DrawEllipse(windowPen, _startPosX + 5 + 25 * i, _startPosY + 35, 16, 24);
}
//окна после двери
for (int i = 0; i < 3; i++)
{
g.DrawEllipse(windowPen, _startPosX + 75 + 25 * i, _startPosY + 35, 16, 24);
}
}
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityBus == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityBus.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityBus.Step > 0,
// вправо
DirectionType.Right => _startPosX + _busWidth + EntityBus.Step < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + _busHeight + EntityBus.Step < _pictureHeight,
_ => false,
};
}
}
}