-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathShip.cs
180 lines (177 loc) · 7.14 KB
/
Ship.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsCars
{
class Ship
{/// <summary>
/// Левая координата отрисовки коробля
/// </summary>
private float _startPosX;
/// <summary>
/// Правая кооридната отрисовки коробля
/// </summary>
private float _startPosY;
/// <summary>
/// Ширина окна отрисовки
/// </summary>
private int _pictureWidth;
//Высота окна отрисовки
private int _pictureHeight;
/// <summary>
/// Ширина отрисовки коробля
/// </summary>
private const int shipWidth = 100;
/// <summary>
/// Ширина отрисовки коробля
/// </summary>
private const int shipHeight = 60;
/// <summary>
/// Максимальная скорость
/// </summary>
public int MaxSpeed { private set; get; }
/// <summary>
/// Вес коробля
/// </summary>
public float Weight { private set; get; }
/// <summary>
/// Основной цвет
/// </summary>
public Color MainColor { private set; get; }
/// <summary>
/// Дополнительный цвет
/// </summary>
public Color DopColor { private set; get; }
/// <summary>
/// Признак наличия трубы
/// </summary>
public bool Pipe { private set; get; }
/// <summary>
/// Признак наличия боковых спойлеров
/// </summary>
public bool SmokeFromPipe { private set; get; }
/// <summary>
/// Признак наличия окон
/// </summary>
public bool Window { private set; get; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="maxSpeed">Максимальная скорость</param>
/// <param name="weight">Вес коробля</param>
/// <param name="mainColor">Основной цвет</param>
/// <param name="dopColor">Дополнительный цвет</param>
/// <param name="pipe">Признак наличия трубы</param>
/// <param name="smokeFromPipe">Признак наличия дыма из трубы</param>
/// <param name="window">Признак наличия окон</param>
public Ship(int maxSpeed, float weight, Color mainColor, Color dopColor, bool
pipe, bool smokeFromPipe, bool window)
{
MaxSpeed = maxSpeed;
Weight = weight;
MainColor = mainColor;
DopColor = dopColor;
Pipe = pipe;
SmokeFromPipe = smokeFromPipe;
Window = window;
}
/// <summary>
/// Установка позиции коробля
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public void SetPosition(int x, int y, int width, int height)
{
_startPosX = x;
_startPosY = y;
_pictureWidth = width;
_pictureHeight = height;
}
/// <summary>
/// Изменение направления пермещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(Direction direction)
{
float step = MaxSpeed * 100 / Weight;
switch (direction)
{
// вправо
case Direction.Right:
if (_startPosX + step < _pictureWidth - shipWidth)
{
_startPosX += step;
}
break;
//влево
case Direction.Left:
if (_startPosX - step > 0)
{
_startPosX -= step;
}
break;
//вверх
case Direction.Up:
if (_startPosY - step > 0)
{
_startPosY -= step;
}
break;
//вниз
case Direction.Down:
if (_startPosY + step < _pictureHeight - shipHeight)
{
_startPosY += step;
}
break;
}
}
/// <summary>
/// Отрисовка коробля
/// </summary>
/// <param name="g"></param>
public void DrawShip(Graphics g)
{
Pen pen = new Pen(Color.Black);
// отрисуем сперва трубу
if (Pipe)
{
Brush spoiler = new SolidBrush(Color.RoyalBlue);
g.FillRectangle(spoiler, _startPosX + 60, _startPosY - 50, 10, 15);
}
// и дым
if (SmokeFromPipe)
{
Brush spoiler = new SolidBrush(DopColor);
g.FillEllipse(spoiler, _startPosX + 57, _startPosY - 47, 2, 2);
g.FillEllipse(spoiler, _startPosX + 52, _startPosY - 44, 3, 3);
g.FillEllipse(spoiler, _startPosX + 43, _startPosY - 42, 5, 5);
}
// теперь отрисуем основную часть корабля
g.DrawLine(pen, _startPosX + 10, _startPosY, _startPosX + 80, _startPosY);
g.DrawLine(pen, _startPosX + 10, _startPosY, _startPosX, _startPosY - 25);
g.DrawLine(pen, _startPosX + 80, _startPosY, _startPosX + 90, _startPosY - 25);
g.DrawLine(pen, _startPosX, _startPosY - 25, _startPosX + 90, _startPosY - 25);
g.DrawLine(new Pen(Color.Red), _startPosX + 5, _startPosY - 13, _startPosX + 85, _startPosY - 13);
g.DrawRectangle(pen, _startPosX + 10, _startPosY - 35, 70, 10);
// рисуем задний спойлер автомобиля
if (Window)
{
Brush spoiler = new SolidBrush(Color.Blue);
g.FillEllipse(spoiler, _startPosX + 45, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 35, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 55, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 65, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 25, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 15, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 75, _startPosY - 23, 7, 7);
g.FillEllipse(spoiler, _startPosX + 5, _startPosY - 23, 7, 7);
}
}
}
}