2023-10-20 07:57:45 +04:00

270 lines
11 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 ProjectAntiAircraftGun.Entities;
using ProjectAntiAircraftGun.MovementStrategy;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace ProjectAntiAircraftGun.DrawingObjects
{
public class DrawingTank
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityTank? EntityTank { 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 _tankWidth = 130;
/// <summary>
/// Высота прорисовки танка
/// </summary>
protected readonly int _tankHeight = 102;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _tankWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _tankHeight;
public IMoveableObject GetMoveableObject => new DrawingObjectTank(this);
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawingTank(int speed, double weight, Color bodyColor, Color additionalColor, int
width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
EntityTank = new EntityTank(speed, weight, bodyColor, additionalColor);
if (_pictureWidth > _tankWidth && _pictureHeight > _tankHeight)
{
EntityTank = new EntityTank(speed, weight, bodyColor, additionalColor);
}
else
{
EntityTank = null;
}
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="tankWidth">Ширина прорисовки танка</param>
/// <param name="tankHeight">Высота прорисовки танка</param>
protected DrawingTank(int speed, double weight, Color bodyColor, Color additionalColor, int
width, int height, int tankWidth, int tankHeight)
{
_pictureWidth = width;
_pictureHeight = height;
_pictureWidth = width;
_pictureHeight = height;
EntityTank = new EntityTank(speed, weight, bodyColor, additionalColor);
if (_pictureWidth > _tankWidth && _pictureHeight > _tankHeight)
{
EntityTank = new EntityTank(speed, weight, bodyColor, additionalColor);
}
else
{
EntityTank = null;
}
}
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityTank == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityTank.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityTank.Step > 0,
// вправо
DirectionType.Right => _startPosX + _tankWidth + EntityTank.Step < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + _tankHeight + EntityTank.Step < _pictureHeight,
_ => false,
};
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityTank == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
_startPosX -= (int)EntityTank.Step;
break;
//вверх
case DirectionType.Up:
_startPosY -= (int)EntityTank.Step;
break;
// вправо
case DirectionType.Right:
_startPosX += (int)EntityTank.Step;
break;
//вниз
case DirectionType.Down:
_startPosY += (int)EntityTank.Step;
break;
}
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (EntityTank == null) return;
while (x + _tankWidth > _pictureWidth)
{
x -= (int)EntityTank.Step;
}
while (x < 0)
{
x += (int)EntityTank.Step;
}
while (y + _tankHeight > _pictureHeight)
{
y -= (int)EntityTank.Step;
}
while (y < 0)
{
y += (int)EntityTank.Step;
}
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityTank == null) { return; }
Pen pen = new(Color.Black);
pen.Width = 2;
Brush brush = new SolidBrush(EntityTank.BodyColor);
Random random = new Random();
Brush additionalBrush = new SolidBrush(EntityTank.AdditionalColor);
// границы зенитной установки
g.DrawRectangle(pen, _startPosX + 3, _startPosY + 60, 121, 23);
g.DrawRectangle(pen, _startPosX + 20, _startPosY + 43, 54, 16);
g.DrawRectangle(pen, _startPosX + 42, _startPosY + 33, 16, 9);
// корпус
g.FillRectangle(brush, _startPosX + 3, _startPosY + 60, 121, 23);
g.FillRectangle(brush, _startPosX + 20, _startPosY + 43, 54, 16);
g.FillRectangle(brush, _startPosX + 42, _startPosY + 33, 16, 9);
// контур гусеницы
g.DrawLine(pen, _startPosX + 13, _startPosY + 100, _startPosX + 114, _startPosY + 100);
g.DrawLine(pen, _startPosX + 6, _startPosY + 99, _startPosX + 16, _startPosY + 99);
g.DrawLine(pen, _startPosX + 4, _startPosY + 98, _startPosX + 6, _startPosY + 98);
g.DrawLine(pen, _startPosX + 4, _startPosY + 97, _startPosX + 4, _startPosY + 86);
g.DrawLine(pen, _startPosX + 4, _startPosY + 86, _startPosX + 5, _startPosY + 86);
g.DrawLine(pen, _startPosX + 5, _startPosY + 85, _startPosX + 10, _startPosY + 85);
g.DrawLine(pen, _startPosX + 10, _startPosY + 84, _startPosX + 116, _startPosY + 84);
g.DrawLine(pen, _startPosX + 116, _startPosY + 85, _startPosX + 123, _startPosY + 85);
g.DrawLine(pen, _startPosX + 124, _startPosY + 86, _startPosX + 125, _startPosY + 86);
g.DrawLine(pen, _startPosX + 125, _startPosY + 87, _startPosX + 125, _startPosY + 97);
g.DrawLine(pen, _startPosX + 123, _startPosY + 98, _startPosX + 125, _startPosY + 98);
g.DrawLine(pen, _startPosX + 115, _startPosY + 99, _startPosX + 123, _startPosY + 99);
//гусеница
g.FillRectangle(additionalBrush, _startPosX + 4, _startPosY + 87, 120, 10);
g.FillRectangle(additionalBrush, _startPosX + 19, _startPosY + 85, 92, 2);
g.FillRectangle(additionalBrush, _startPosX + 14, _startPosY + 93, 100, 7);
// контур колес
g.DrawEllipse(pen, _startPosX + 5, _startPosY + 83, 18, 17);
g.DrawEllipse(pen, _startPosX + 30, _startPosY + 88, 15, 12);
g.DrawEllipse(pen, _startPosX + 50, _startPosY + 88, 15, 12);
g.DrawEllipse(pen, _startPosX + 70, _startPosY + 88, 15, 12);
g.DrawEllipse(pen, _startPosX + 87, _startPosY + 88, 15, 12);
g.DrawEllipse(pen, _startPosX + 107, _startPosY + 83, 18, 17);
// контур верхних катков
g.DrawEllipse(pen, _startPosX + 43, _startPosY + 83, 7, 5);
g.DrawEllipse(pen, _startPosX + 64, _startPosY + 83, 7, 5);
g.DrawEllipse(pen, _startPosX + 82, _startPosY + 83, 7, 5);
// колеса
g.FillEllipse(brush, _startPosX + 5, _startPosY + 83, 18, 17);
g.FillEllipse(brush, _startPosX + 30, _startPosY + 88, 15, 12);
g.FillEllipse(brush, _startPosX + 50, _startPosY + 88, 15, 12);
g.FillEllipse(brush, _startPosX + 70, _startPosY + 88, 15, 12);
g.FillEllipse(brush, _startPosX + 87, _startPosY + 88, 15, 12);
g.FillEllipse(brush, _startPosX + 107, _startPosY + 83, 18, 17);
// верхние катки
g.FillEllipse(brush, _startPosX + 43, _startPosY + 83, 7, 5);
g.FillEllipse(brush, _startPosX + 64, _startPosY + 83, 7, 5);
g.FillEllipse(brush, _startPosX + 82, _startPosY + 83, 7, 5);
}
}
}