PIBD-12 kuznetsov_I.V. LabWork02 Simple #2

Closed
ILYAKuznetsov wants to merge 3 commits from LabWork02 into LabWork01
13 changed files with 621 additions and 268 deletions
Showing only changes of commit 125be39c5f - Show all commits

31
Lab1_OAP/Lab1_OAP.sln Normal file
View File

@ -0,0 +1,31 @@

Outdated
Review

Данный элемент не относится к решению требуемой задачи

Данный элемент не относится к решению требуемой задачи
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34525.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lab1_OAP", "Lab1_OAP\Lab1_OAP.vcxproj", "{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x64.ActiveCfg = Debug|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x64.Build.0 = Debug|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x86.ActiveCfg = Debug|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Debug|x86.Build.0 = Debug|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x64.ActiveCfg = Release|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x64.Build.0 = Release|x64
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x86.ActiveCfg = Release|Win32
{39E703FF-4168-4ACA-84CA-CDD94BFE3FD3}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AD8890FA-E7D7-4EB8-996C-597872ABE83B}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{39e703ff-4168-4aca-84ca-cdd94bfe3fd3}</ProjectGuid>
<RootNamespace>Lab1OAP</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Lab1_OAP.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Исходные файлы">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Файлы заголовков">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Файлы ресурсов">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Lab1_OAP.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -1,186 +0,0 @@
namespace ProjectGasolineTanker;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingGasolineTanker
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityGasolineTanker? EntityGasolineTanker { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки газовоза
/// </summary>
private int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки газовоза
/// </summary>
private int? _startPosY;
/// <summary>
/// Ширина прорисовки газовоза
/// </summary>
private readonly int _drawingTankerWidth = 160;
/// <summary>
/// Высота прорисовки газовоза
/// </summary>
private readonly int _drawingTankerHeight = 55;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшения на колесах</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool ornamentWheels)
{
EntityGasolineTanker = new EntityGasolineTanker();
EntityGasolineTanker.Init(speed, weight, bodyColor, additionalColor, bodyKit, ornamentWheels);
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int height)
{
// TODO проверка, что объект "влезает" в размеры поля
// если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена
_pictureWidth = width;
_pictureHeight = height;
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
// TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы
// то надо изменить координаты, чтобы он оставался в этих границах
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityGasolineTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - (int)EntityGasolineTanker.Step > 0)
{
_startPosX -= (int)EntityGasolineTanker.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - (int)EntityGasolineTanker.Step > 0)
{
_startPosY -= (int)EntityGasolineTanker.Step;
}
return true;
//вправо
case DirectionType.Right:
if (_startPosX.Value + _drawingTankerWidth + (int)EntityGasolineTanker.Step < _pictureWidth)
{
_startPosX += (int)EntityGasolineTanker.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawingTankerHeight + (int)EntityGasolineTanker.Step < _pictureHeight)
{
_startPosY += (int)EntityGasolineTanker.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityGasolineTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
//бак бензовоза
Pen pen = new Pen(Color.Black);
Brush dopBrush = new SolidBrush(EntityGasolineTanker.AdditionalColor);
if (EntityGasolineTanker.BodyKit)
{
g.FillRectangle(dopBrush, _startPosX.Value + 25, _startPosY.Value + 5, 100, 35);
g.FillRectangle(dopBrush, _startPosX.Value + 80, _startPosY.Value, 10, 5);
}
//колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
//корпус
Brush br = new SolidBrush(EntityGasolineTanker?.BodyColor ?? Color.Black);
g.FillRectangle(br, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 35, 140, 10);
//окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
//окантовка
g.DrawRectangle(pen, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
g.DrawRectangle(pen, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 35, 105, 10);
//крыло колеса
if (EntityGasolineTanker != null && EntityGasolineTanker.OrnamentWheels)
{
Pen penGray = new Pen(Color.Gray);
g.DrawEllipse(penGray, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
}
}
}

View File

@ -1,4 +1,4 @@
namespace ProjectGasolineTanker;
namespace ProjectGasolineTanker.Drawings;
/// <summary>
/// Направление перемещения

View File

@ -0,0 +1,73 @@
using ProjectGasolineTanker.Entities;
namespace ProjectGasolineTanker.Drawings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingGasolineTanker : DrawingTanker
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tank">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшения на колесах</param>
public DrawingGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels) : base(160,55)
{
EntityTanker = new EntityGasolineTanker(speed, weight, bodyColor, additionalColor, tank, ornamentWheels);
}
public override void DrawTransport(Graphics g)
{
if (EntityTanker == null || EntityTanker is not EntityGasolineTanker tanker || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new Pen(Color.Black);
Brush dopBrush = new SolidBrush(tanker.AdditionalColor);
//колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
//корпус
Brush br = new SolidBrush(tanker?.BodyColor ?? Color.Black);
g.FillRectangle(br, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 35, 140, 10);
//окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
//окантовка
g.DrawRectangle(pen, _startPosX.Value + 120, _startPosY.Value + 10, 25, 25);
g.DrawRectangle(pen, _startPosX.Value + 115, _startPosY.Value + 5, 40, 40);
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 35, 105, 10);
_startPosX += 10;
_startPosY += 10;
base.DrawTransport(g);
_startPosX -= 10;
_startPosY -= 10;
//бак бензовоза
if (tanker != null && tanker.Tank)
{
g.FillRectangle(dopBrush, _startPosX.Value + 25, _startPosY.Value + 5, 100, 35);
g.FillRectangle(dopBrush, _startPosX.Value + 80, _startPosY.Value, 10, 5);
}
//крыло колеса
if (tanker != null && tanker.OrnamentWheels)
{
Pen penGray = new Pen(Color.Gray);
g.DrawEllipse(penGray, _startPosX.Value + 130, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 10, _startPosY.Value + 35, 20, 20);
g.DrawEllipse(penGray, _startPosX.Value + 30, _startPosY.Value + 35, 20, 20);
}
}
}

View File

@ -0,0 +1,205 @@
using ProjectGasolineTanker.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.Drawings;
public class DrawingTanker
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityTanker? EntityTanker { 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>
private readonly int _drawingTankerWidth = 130;
/// <summary>
/// Высота прорисовки газовоза
/// </summary>
private readonly int _drawingTankerHeight = 50;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawingTanker()
{
_pictureWidth = null;
_pictureHeight = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawingTanker(int speed, double weight, Color bodyColor) : this()
{
EntityTanker = new EntityTanker(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="_drawingTankerWidt">Ширина прорисовки газовоза</param>
/// <param name="_drawingTankerHeight">Высота прорисовки газовоза</param>
protected DrawingTanker(int _drawingTankerWidth, int _drawingTankerHeight) : this()
{
_drawingTankerWidth = _drawingTankerWidth;
_drawingTankerHeight = _drawingTankerHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
/// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public Boolean SetPictureSize(int width, int height)
{
if (width <= _drawingTankerWidth || height <= _drawingTankerHeight) return false;
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue && _startPosY.HasValue)
{
if (_startPosX + _drawingTankerWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _drawingTankerWidth;
}
if (_startPosY + _drawingTankerHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _drawingTankerHeight;
}
}
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
_startPosX = x;
_startPosY = y;
if (_drawingTankerHeight + y > _pictureHeight || y < 0)
{
_startPosY = 0;
}
if (_drawingTankerWidth + x > _pictureWidth || x < 0)
{
_startPosX = 0;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX.Value - (int)EntityTanker.Step > 0)
{
_startPosX -= (int)EntityTanker.Step;
}
return true;
//вверх
case DirectionType.Up:
if (_startPosY.Value - (int)EntityTanker.Step > 0)
{
_startPosY -= (int)EntityTanker.Step;
}
return true;
//вправо
case DirectionType.Right:
if (_startPosX.Value + _drawingTankerWidth + (int)EntityTanker.Step < _pictureWidth)
{
_startPosX += (int)EntityTanker.Step;
}
return true;
//вниз
case DirectionType.Down:
if (_startPosY.Value + _drawingTankerHeight + (int)EntityTanker.Step < _pictureHeight)
{
_startPosY += (int)EntityTanker.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityTanker == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new Pen(Color.Black);
//колеса
Brush brBlack = new SolidBrush(Color.Black);
g.FillEllipse(brBlack, _startPosX.Value + 120, _startPosY.Value + 25, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 25, 20, 20);
g.FillEllipse(brBlack, _startPosX.Value + 20, _startPosY.Value + 25, 20, 20);
//корпус
Brush br = new SolidBrush(EntityTanker?.BodyColor ?? Color.Black);
g.FillRectangle(br, _startPosX.Value + 105, _startPosY.Value, 40, 40);
g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 25, 140, 10);
//окно
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 110, _startPosY.Value, 25, 25);
//окантовка
g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value, 25, 25);
g.DrawRectangle(pen, _startPosX.Value + 105, _startPosY.Value, 40, 40);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 25, 105, 10);
}
}

View File

@ -0,0 +1,45 @@
using System.Drawing;
namespace ProjectGasolineTanker.Entities
{
/// <summary>
/// Класс-сущность "Газовоз"
/// </summary>
public class EntityGasolineTanker : EntityTanker
{
public EntityGasolineTanker(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels) : base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Tank = tank;
OrnamentWheels = ornamentWheels;
}
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак наличия цистерны
/// </summary>
public bool Tank { get; private set; }
/// <summary>
/// Признак наличия украшенных колес
/// </summary>
public bool OrnamentWheels { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса газовоза
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес газовоза</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="tank">Признак наличия цистерны</param>
/// <param name="ornamentWheels">Признак наличия украшенных колес</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool tank, bool ornamentWheels)
{
AdditionalColor = additionalColor;
Tank = tank;
OrnamentWheels = ornamentWheels;
}
}
}

View File

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectGasolineTanker.Entities;
/// <summary>
/// Класс-сущность "Танкер"
/// </summary>
public class EntityTanker
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Шаг перемещения газовоза
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
/// Конструктор сущности
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес газовоза</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityTanker(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -1,61 +0,0 @@
namespace ProjectGasolineTanker;
/// <summary>
/// Класс-сущность "Газовоз"
/// </summary>
public class EntityGasolineTanker
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак наличия обвеса
/// </summary>
public bool BodyKit { get; private set; }
/// <summary>
/// Признак наличия украшенных колес
/// </summary>
public bool OrnamentWheels { get; private set; }
/// <summary>
/// Шаг перемещения газовоза
/// </summary>
public double Step => Speed * 100 / Weight;
/// <summary>
/// Инициализация полей объекта-класса газовоза
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес газовоза</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="ornamentWheels">Признак наличия украшенных колес</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool ornamentWheels)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
BodyKit = bodyKit;
OrnamentWheels = ornamentWheels;
}
}

View File

@ -34,6 +34,7 @@
buttonDown = new Button();
buttonRight = new Button();
buttonUp = new Button();
buttonCreateTanker = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxGasolineTanker).BeginInit();
SuspendLayout();
//
@ -51,9 +52,9 @@
buttonCreateGasolineTanker.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateGasolineTanker.Location = new Point(12, 682);
buttonCreateGasolineTanker.Name = "buttonCreateGasolineTanker";
buttonCreateGasolineTanker.Size = new Size(112, 34);
buttonCreateGasolineTanker.Size = new Size(230, 34);
buttonCreateGasolineTanker.TabIndex = 1;
buttonCreateGasolineTanker.Text = "Создать";
buttonCreateGasolineTanker.Text = "Создать Бензовоз";
buttonCreateGasolineTanker.UseVisualStyleBackColor = true;
buttonCreateGasolineTanker.Click += buttonCreateGasolineTanker_Click;
//
@ -105,11 +106,23 @@
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click;
//
// buttonCreateTanker
//
buttonCreateTanker.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateTanker.Location = new Point(248, 682);
buttonCreateTanker.Name = "buttonCreateTanker";
buttonCreateTanker.Size = new Size(230, 34);
buttonCreateTanker.TabIndex = 6;
buttonCreateTanker.Text = "Создать Грузовик";
buttonCreateTanker.UseVisualStyleBackColor = true;
buttonCreateTanker.Click += buttonCreateTanker_Click;
//
// FormGasolineTanker
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1312, 749);
Controls.Add(buttonCreateTanker);
Controls.Add(buttonUp);
Controls.Add(buttonRight);
Controls.Add(buttonDown);
@ -130,5 +143,6 @@
private Button buttonDown;
private Button buttonRight;
private Button buttonUp;
private Button buttonCreateTanker;
}
}

View File

@ -1,4 +1,5 @@
using System;
using ProjectGasolineTanker.Drawings;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
@ -15,7 +16,7 @@ namespace ProjectGasolineTanker
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawingGasolineTanker? _drawingGasolineTanker;
private DrawingTanker? _drawingTanker;
/// <summary>
/// Инициализация формы
/// </summary>
@ -28,16 +29,43 @@ namespace ProjectGasolineTanker
/// </summary>
private void Draw()
{
if (_drawingGasolineTanker == null)
if (_drawingTanker == null)
{
return;
}
Bitmap bmp = new(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawingGasolineTanker.DrawTransport(gr);
_drawingTanker.DrawTransport(gr);
pictureBoxGasolineTanker.Image = bmp;
}
private void CreateObject(string type)
{
Random random = new();
switch (type)
{
case nameof(DrawingTanker):
_drawingTanker = new DrawingTanker(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
case nameof(DrawingGasolineTanker):
_drawingTanker = new DrawingGasolineTanker(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break;
default:
return;
}
_drawingTanker.SetPictureSize(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
_drawingTanker.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
/// <summary>
/// Обработка нажатия кнопки создать
/// </summary>
@ -45,16 +73,14 @@ namespace ProjectGasolineTanker
/// <param name="e"></param>
private void buttonCreateGasolineTanker_Click(object sender, EventArgs e)
{
Random random = new();
_drawingGasolineTanker = new DrawingGasolineTanker();
_drawingGasolineTanker.Init(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
_drawingGasolineTanker.SetPictureSize(pictureBoxGasolineTanker.Width, pictureBoxGasolineTanker.Height);
_drawingGasolineTanker.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
CreateObject(nameof(DrawingGasolineTanker));
}
private void buttonCreateTanker_Click(object sender, EventArgs e)
{
CreateObject(nameof(DrawingTanker));
}
/// <summary>
/// Перемещение объекта по форме (нажатие кнопок навигации)
/// </summary>
@ -62,7 +88,7 @@ namespace ProjectGasolineTanker
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawingGasolineTanker == null)
if (_drawingTanker == null)
{
return;
}
@ -72,16 +98,16 @@ namespace ProjectGasolineTanker
switch (name)
{
case "buttonUp":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Up);
result = _drawingTanker.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Down);
result = _drawingTanker.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Left);
result = _drawingTanker.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
result = _drawingGasolineTanker.MoveTransport(DirectionType.Right);
result = _drawingTanker.MoveTransport(DirectionType.Right);
break;
}