🎮 🎱 Три мини-проекта, написанные в процессе изучения технологии Windows Forms в рамках изучения рисования, движения объектов на форме и принципов ООП.
- Есть кнопка "Создать", которая создает на форме много разноцветных шариков разного размера, которые начинают двигаться в разные стороны и с разной скоростью.
- Есть кнопка "Остановить", которая останавливает все созданные шарики. После остановки шариков, выдаётся пользователю количество шариков, которые удалось поймать. Шарик пойман, если он полностью находится на форме.
Пример геймплея игры:
- Есть кнопка "Создать", которая создает на форме много разноцветных шариков разного размера, которые начинают двигаться в разные стороны и с разной скоростью.
- Клик левой кнопки мыши по шарику позволяет "поймать" соответствующий шарик.
Цель игры — "поймать" как можно больше шариков.
Пример геймплея игры:
Шарики создаются в рандомном месте с рандомными цветами, размерами и скоростями. Шарики отталкиваются от стенок и генерируют событие столкновения с соответствующей стенкой.
Пример работы программы:
- Проект реализован на платформе Windows Forms.
- Выполнен с соблюдением принципов ООП.
- Реализована работы с событиями.
Структура каталога решения:
Проект "Common" является общей библиотекой классов для следующих проектов:
Библиотека содержит общий класс "Ball" от которого наследуются другие шарики со своими особенностями.
В классе бильярдного шарика "BilliardBall" реализована работа с событиями:
public class BilliardBall : MoveRandomPointBall
{
private int ballSize = 50;
public event EventHandler<HitEventArgs> OnHitted;
public BilliardBall(int borderX, int borderY) : base(borderX, borderY)
{
diameter = ballSize;
}
public override void Move()
{
base.Move();
if (centerPoint.X + speed.VX < LeftSide())
{
speed.VX = -speed.VX;
OnHitted.Invoke(this, new HitEventArgs(Side.Left));
}
else if (centerPoint.X + speed.VX > RightSide())
{
speed.VX = -speed.VX;
OnHitted.Invoke(this, new HitEventArgs(Side.Right));
}
else if (centerPoint.Y + speed.VY < TopSide())
{
speed.VY = -speed.VY;
OnHitted.Invoke(this, new HitEventArgs(Side.Top));
}
else if (centerPoint.Y + speed.VY > BottomSide())
{
speed.VY = -speed.VY;
OnHitted.Invoke(this, new HitEventArgs(Side.Bottom));
}
}
}
Если шарик столкнулся с одной из стенок, то генерируется событие OnHitted
в аргументах которого передаётся стенка с которой ударился шарик.
Класс HitEventArgs
:
public class HitEventArgs
{
public Side Side;
public HitEventArgs(Side side)
{
Side = side;
}
}
В MainForm
происходит подписывание на событие OnHitted
, при возникновении которого происходит увеличение значения счётчика количества соударений с соответствующей стенкой:
ball.OnHitted += Ball_OnHitted;