Merge pull request 'done lab1' (#2) from Lab1 into main

Reviewed-on: #2
This commit is contained in:
AnastasiaSinelnikova 2024-02-29 14:00:02 +04:00
commit 8c41db19a0
3 changed files with 69 additions and 94 deletions

View File

@ -1,51 +1,51 @@
using ProjectCruiser;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
namespace ProjectCruiser; namespace ProjectCruiser;
/// <summary> /// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary> /// </summary>
public class DrawningCruiser public class DrawningCruiser
{ {
/// <summary> /// <summary>
/// Класс-сущность /// Класс-сущность
/// </summary> /// </summary>
public EntityCruiser? EntityCruiser { get; private set; } public EntityCruiser? EntityCruiser { get; private set; }
/// <summary> /// <summary>
/// Ширина окна /// Ширина окна
/// </summary> /// </summary>
private int? _pictureWidth; private int? _pictureWidth;
/// <summary> /// <summary>
/// Высота окна /// Высота окна
/// </summary> /// </summary>
private int? _pictureHeight; private int? _pictureHeight;
/// <summary> /// <summary>
/// Левая координата прорисовки автомобиля /// Левая координата прорисовки автомобиля
/// </summary> /// </summary>
private int? _startPosX; private int? _startPosX;
/// <summary> /// <summary>
/// Верхняя кооридната прорисовки автомобиля /// Верхняя кооридната прорисовки автомобиля
/// </summary> /// </summary>
private int? _startPosY; private int? _startPosY;
/// <summary> /// <summary>
/// Ширина прорисовки автомобиля /// Ширина прорисовки крейсера
/// </summary> /// </summary>
private readonly int _drawningCruiserWidth = 110; private readonly int _drawningCruiserWidth = 150;
/// <summary> /// <summary>
/// Высота прорисовки автомобиля /// Высота прорисовки крейсера
/// </summary> /// </summary>
private readonly int _drawningCruiserHeight = 60; private readonly int _drawningCruiserHeight = 50;
private readonly int _drawningEnginesWidth = 3;
/// <summary> /// <summary>
/// Инициализация свойств /// Инициализация свойств
/// </summary> /// </summary>
/// <param name="speed">Скорость</param> /// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param> /// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param> /// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param> /// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="helicopterArea">Признак наличия обвеса</param> /// <param name="helicopterArea">Признак наличия вертолетной площадки</param>
/// <param name="boat">Признак наличия антикрыла</param> /// <param name="boat">Признак наличия шлюпок</param>
/// <param name="wepon">Признак наличия гоночной полосы</param> /// <param name="wepon">Признак наличия пушки</param>
public void Init(int speed, double weight, Color bodyColor, Color public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool helicopterArea, bool boat, bool wepon) additionalColor, bool helicopterArea, bool boat, bool wepon)
{ {
@ -58,34 +58,37 @@ public class DrawningCruiser
_startPosY = null; _startPosY = null;
} }
/// <summary> /// <summary>
/// Установка границ поля /// Установка границ поля
/// </summary> /// </summary>
/// <param name="width">Ширина поля</param> /// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param> /// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns> /// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height) public bool SetPictureSize(int width, int height)
{ {
// TODO проверка, что объект "влезает" в размеры поля // TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта,если она была уже установлена // если влезает, сохраняем границы и корректируем позицию объекта,если она была уже установлена
if (_startPosX + 150 > width) if (_drawningCruiserHeight > height || _drawningCruiserWidth > width)
{ {
_startPosX -= (_startPosX + 150) - width; return false;
}
if (_startPosY + 80 > height)
{
_startPosY -= (_startPosY + 80) - height;
} }
_pictureWidth = width; _pictureWidth = width;
_pictureHeight = height; _pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
SetPosition(_startPosX.Value, _startPosY.Value);
}
return true; return true;
} }
/// <summary> /// <summary>
/// Установка позиции /// Установка позиции
/// </summary> /// </summary>
/// <param name="x">Координата X</param> /// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param> /// <param name="y">Координата Y</param>
public void SetPosition(int x, int y) public void SetPosition(int x, int y)
{ {
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
@ -93,29 +96,23 @@ public class DrawningCruiser
return; return;
} }
if(x + 150 > _pictureWidth) if (x < 0 || x + _drawningCruiserWidth > _pictureWidth || y < 0 || y + _drawningCruiserHeight > _pictureHeight)
{ {
x -= (x+150) - _pictureWidth.Value; _startPosX = _pictureWidth - _drawningCruiserWidth;
_startPosY = _pictureHeight - _drawningCruiserHeight;
} }
else
if (y + 50 > _pictureHeight)
{ {
y -= (y+50) - _pictureHeight.Value;
}
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
_startPosX = x; _startPosX = x;
_startPosY = y; _startPosY = y;
}
} }
/// <summary> /// <summary>
/// Изменение направления перемещения /// Изменение направления перемещения
/// </summary> /// </summary>
/// <param name="direction">Направление</param> /// <param name="direction">Направление</param>
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns> /// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue)
@ -124,41 +121,31 @@ public class DrawningCruiser
} }
switch (direction) switch (direction)
{ {
//влево //влево
case DirectionType.Left: case DirectionType.Left:
if (_startPosX.Value - EntityCruiser.Step > 0) if (_startPosX.Value - EntityCruiser.Step - _drawningEnginesWidth > 0)
{ {
_startPosX -= (int)EntityCruiser.Step; _startPosX -= (int)EntityCruiser.Step;
} }
return true; return true;
//вверх //вверх
case DirectionType.Up: case DirectionType.Up:
if (_startPosY.Value - EntityCruiser.Step > 0) if (_startPosY.Value - EntityCruiser.Step > 0)
{ {
_startPosY -= (int)EntityCruiser.Step; _startPosY -= (int)EntityCruiser.Step;
} }
return true; return true;
// вправо // вправо
case DirectionType.Right: case DirectionType.Right:
if (_startPosX.Value >= 640) //TODO прописать логику сдвига в право
{ if (_startPosX.Value + EntityCruiser.Step + _drawningCruiserWidth < _pictureWidth)
return true;
}
//TODO прописать логику сдвига в право
if (_startPosX.Value + EntityCruiser.Step > 0)
{ {
_startPosX += (int)EntityCruiser.Step; _startPosX += (int)EntityCruiser.Step;
} }
return true; return true;
//вниз //вниз
case DirectionType.Down: case DirectionType.Down:
//TODO прописать логику сдвига в вниз if (_startPosY.Value + EntityCruiser.Step + _drawningCruiserHeight < _pictureHeight)
if(_startPosY.Value >= 390)
{
return true;
}
if (_startPosY.Value + EntityCruiser.Step > 0)
{ {
_startPosY += (int)EntityCruiser.Step; _startPosY += (int)EntityCruiser.Step;
} }
@ -168,7 +155,7 @@ public class DrawningCruiser
} }
} }
/// <summary> /// <summary>
/// Прорисовка объекта /// Прорисовка объекта
/// </summary> /// </summary>
/// <param name="g"></param> /// <param name="g"></param>
public void DrawTransport(Graphics g) public void DrawTransport(Graphics g)
@ -178,15 +165,14 @@ public class DrawningCruiser
{ {
return; return;
} }
Pen pen = new(Color.Black, 2); Pen pen = new(EntityCruiser.BodyColor, 2);
Brush additionalBrush = new SolidBrush(Color.Black); Brush additionalBrush = new SolidBrush(Color.Black);
Brush weaponBrush = new SolidBrush(Color.Black); Brush weaponBrush = new SolidBrush(Color.Black);
Brush weaponBrush2 = new SolidBrush(EntityCruiser.AdditionalColor); Brush weaponBrush2 = new SolidBrush(EntityCruiser.AdditionalColor);
Brush helicopterAreaBrush = new HatchBrush(HatchStyle.ZigZag, EntityCruiser.AdditionalColor, Color.FromArgb(163, 163, 163)); Brush helicopterAreaBrush = new HatchBrush(HatchStyle.ZigZag, EntityCruiser.AdditionalColor, Color.FromArgb(163, 163, 163));
Brush boatBrush = new SolidBrush(EntityCruiser.AdditionalColor); Brush boatBrush = new SolidBrush(EntityCruiser.AdditionalColor);
//границы круисера //границы круисера
g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value + 105, _startPosY.Value); g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value + 105, _startPosY.Value);
g.DrawLine(pen, _startPosX.Value + 105, _startPosY.Value, _startPosX.Value + 147, _startPosY.Value + 24); g.DrawLine(pen, _startPosX.Value + 105, _startPosY.Value, _startPosX.Value + 147, _startPosY.Value + 24);
@ -195,13 +181,13 @@ public class DrawningCruiser
g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value, _startPosY.Value + 49); g.DrawLine(pen, _startPosX.Value, _startPosY.Value, _startPosX.Value, _startPosY.Value + 49);
//внутренности круисера //внутренности круисера
g.DrawEllipse(pen, _startPosX.Value + 94, _startPosY.Value + 14, 19, 19); g.DrawEllipse(pen, _startPosX.Value + 94, _startPosY.Value + 14, 19, 19);
g.DrawRectangle(pen, _startPosX.Value + 63, _startPosY.Value + 11, 21, 28); g.DrawRectangle(pen, _startPosX.Value + 63, _startPosY.Value + 11, 21, 28);
g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 17, 28, 14); g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 17, 28, 14);
//зад //зад
g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 7, 3, 14); g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 7, 3, 14);
g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 26, 3, 14); g.FillRectangle(additionalBrush, _startPosX.Value - 3, _startPosY.Value + 26, 3, 14);
@ -225,10 +211,7 @@ public class DrawningCruiser
g.DrawEllipse(pen, _startPosX.Value + 97, _startPosY.Value + 36, 10, 10); g.DrawEllipse(pen, _startPosX.Value + 97, _startPosY.Value + 36, 10, 10);
g.FillEllipse(weaponBrush2, _startPosX.Value + 97, _startPosY.Value + 36, 10, 10); g.FillEllipse(weaponBrush2, _startPosX.Value + 97, _startPosY.Value + 36, 10, 10);
g.FillRectangle(weaponBrush, _startPosX.Value + 107, _startPosY.Value + 40, 15, 5); g.FillRectangle(weaponBrush, _startPosX.Value + 107, _startPosY.Value + 40, 15, 5);
} }
} }

View File

@ -4,6 +4,7 @@
/// </summary> /// </summary>
public class EntityCruiser public class EntityCruiser
{ {
//свойства
/// <summary> /// <summary>
/// Скорость /// Скорость
/// </summary> /// </summary>
@ -27,18 +28,18 @@ public class EntityCruiser
/// <summary> /// <summary>
/// Признак (опция) наличие шлюпок /// Признак (опция) наличие шлюпок
/// </summary> /// </summary>
public bool Boat { get; private set; } public bool Boat { get; private set; }
/// <summary> /// <summary>
/// Признак (опция) наличие тц /// Признак (опция) наличие пушки
/// </summary> /// </summary>
public bool Weapon { get; private set; } public bool Weapon { get; private set; }
//поле класса
/// <summary> /// <summary>
/// Шаг перемещения автомобиля /// Шаг перемещения автомобиля
/// </summary> /// </summary>
public double Step => Speed * 100 / Weight; public double Step => Speed * 100 / Weight;
/// <summary> /// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля /// Инициализация полей объекта-класса крейсера
/// </summary> /// </summary>
/// <param name="speed">скорость</param> /// <param name="speed">скорость</param>
/// <param name="weight">вес</param> /// <param name="weight">вес</param>
@ -46,7 +47,7 @@ public class EntityCruiser
/// <param name="additionalColor">дополнительный цвет</param> /// <param name="additionalColor">дополнительный цвет</param>
/// <param name="helicopterArea">вертолетная площадка</param> /// <param name="helicopterArea">вертолетная площадка</param>
/// <param name="boat">шлюпки</param> /// <param name="boat">шлюпки</param>
/// <param name="wepon">наличие тц</param> /// <param name="wepon">наличие пушки</param>
public void Init(int speed, double weight, Color bodyColor, Color public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool helicopterArea, bool boat, bool wepon) additionalColor, bool helicopterArea, bool boat, bool wepon)
{ {

View File

@ -1,14 +1,4 @@
using System; namespace ProjectCruiser
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectCruiser
{ {
public partial class FormCruiser : Form public partial class FormCruiser : Form
{ {
@ -23,7 +13,7 @@ namespace ProjectCruiser
} }
/// <summary> /// <summary>
/// Метод прорисовки машины /// Метод прорисовки круисера
/// </summary> /// </summary>
private void Draw() private void Draw()
{ {
@ -55,8 +45,9 @@ namespace ProjectCruiser
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
_drawningCruiser.SetPictureSize(pictureBox1.Width, _drawningCruiser.SetPictureSize(pictureBox1.Width,
pictureBox1.Height); pictureBox1.Height);
_drawningCruiser.SetPosition(random.Next(10, 100), random.Next(10,
100)); //начальное положение круисера
_drawningCruiser.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw(); Draw();
} }
/// <summary> /// <summary>