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();                                             // Запуск обновления формы
            }
        }
    }

 


Оставить комментарий