C# Простейшая графическая игра WinForms
C# Самая простая графическая игра WinForms
Ссылка на GitFlic проект aSimpleGame
Создаем форму Form1
Копируем код:
// После клика на форме
// Создаем черный кружок и прямоугольник
// Кружок двигается по форме отражаясь от верхнего и боковых краев
// От прямоугольника кружок отражается только вверх
// Если кружок выходит за пределы формы вниз, то игра прекращается
public partial class Form1 : Form
{
private int radius = 10; // Количество пикселей, задающих радиус круга и размеры прямоугольника
private int x; // Текущее положение круга
private int y; // Текущее положение круга
private int xDirection; // Направление движения и скорость круга - минус влево
private int yDirection; // Направление движения и скорость круга - минус вверх
private readonly SolidBrush brush = new(Color.Black); // Цвет заливки
private readonly System.Windows.Forms.Timer timer; // Таймер, задающий скорость обновления
public Form1()
{
InitializeComponent(); // Инициализация компонентов формы
this.components = new System.ComponentModel.Container(); // Так как компонентов нет, создадим контейнер вручную
timer = new System.Windows.Forms.Timer(this.components); // Таймер добавим в компоненты формы чтобы автоматически удалился
timer.Interval = 15; // Интервал обновления задает скорость обновления формы
timer.Tick += new System.EventHandler(timerTick); // Метод, который будет вызываться каждый тик таймера
this.Click += new System.EventHandler(this.Form1_Click); // При клике на форме будем запускать или отключать игру
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); // Метод отрисовки
SetStyle( ControlStyles.OptimizedDoubleBuffer // Свойства формы,
| ControlStyles.AllPaintingInWmPaint // задающие параметры обновления
| ControlStyles.UserPaint // и отрисовки
, true
);
UpdateStyles();
}
private void initGame() // Начало игры
{
Point point = this.PointToClient(Cursor.Position); // Считываем позицию курсора мыши
x = point.X;
y = point.Y - radius;
xDirection = -1; // Направление влево
yDirection = -1; // вверх
Cursor.Hide(); // Скрываем курсор мыши
timer.Enabled = true; // Включаем обновление формы
}
private void stopGame() // Остановка игры
{
Cursor.Show(); // Показываем курсор мыши
timer.Enabled = false; // Отключаем обновление формы
}
private void Form1_Click(object? sender, EventArgs e) // Клик на форме
{
if (timer.Enabled) // Если таймер запущен
{
this.stopGame(); // Останавливаем игру
}
else
{
this.initGame(); // иначе запускаем
}
}
private void Form1_Paint(object? sender, PaintEventArgs e) // Отрисовка формы
{
;
if (timer.Enabled) // Если таймер запущен
{
if (y > this.Height) // Круг вышел за пределы формы вниз
{
this.stopGame(); // Останавливаем игру
}
else
{
Graphics g = e.Graphics; // На чем будем рисовать
Point point = this.PointToClient(Cursor.Position);// Прямоугольник в позицию курсора
g.FillEllipse(brush, new Rectangle(x - radius, y - radius, 2 * radius, 2 * radius));
g.FillRectangle(brush, new Rectangle(point.X - 5 * radius, point.Y, 10 * radius, radius));
}
}
}
private void timerTick(object? sender, EventArgs e) // Запуск обновления формы
{
if (timer.Enabled) // Если таймер запущен
{
x += xDirection; // Двигаем кружок
y += yDirection;
if ( x < radius
|| x > this.Width - radius - 16
)
{
xDirection *= -1; // Отражаем влево вправо
}
if (y < radius)
{
yDirection *= -1; // Отражаем сверху
}
if (yDirection > 0) // Если летит вниз
{
Point point = this.PointToClient(Cursor.Position); // Текущая позиция курсора мыши
if ( x < point.X + 5*radius + radius // задает положение
&& x > point.X - 5*radius - radius // прямоугольника
&& y < point.Y + radius // Проверяем прикосновение
&& y > point.Y - radius
)
{
yDirection = -1; // Вверх
y = point.Y - radius; // Коррекция положения кружка
}
}
this.Refresh(); // Запуск обновления формы
}
}
}