Звезды 2D

Создадим простейшую анимацию звезд движущих справо налево. Поскольку все звезды находятся на разном расстоянии от наблюдателя в космосе, то их движение по экрану тоже должно быть различным, за счет этого создается эффект параллакса 

Объявим нужные переменные:

const int N = 400; // общее количество звезд

float[] starsX = new float[N]; // позиция звезд по X
float[] starsY = new float[N]; // позиция звезд по Y
float[] starsSize = new float[N]; // размеры звезд 
float[] starsSpeed = new float[N]; // скорости звезд 

Напишем метод который радномно заполняет все массивы, чтобы создать стартовое случайное распределение звезд по экрану

 

    private void InitStars()
    {
        var width = ClientSize.Width;
        var height = ClientSize.Height;
        for (int i = 0; i < N; i++)
        {
            starsX[i] = rand.Next(width);
            starsY[i] = rand.Next(height);
            starsSpeed[i] = rand.Next(10, 100) / 10f;
            starsSize[i] = rand.Next(1, 4);
        }
    }
Теперь на каждую итерацию обновления сцены мы должны пройтись циклом по всем звездам (от 0 до N-1) и обновить позицию каждой звезды по X. По следующему простому алгоритму:

1. Отнять из координаты X звезды ее скорость

2. Если звезда оказалась за пределами экрана (X<0) то нужно телепортировать (перенести) ее на правый край экрана. За счет этого будет эффект бесконечного полета бесконечного количества звезд. На самом деле звезд на экране всегда одинаковое количество N, и они переиспользуются в момент выхода за левый кран окна.

 private void Form1_Paint(object? sender, PaintEventArgs e)
 {
     var gr = e.Graphics;
     gr.Clear(Color.Black);
     for (int i = 0; i < N; i++)
     {
         // update i-th star's position
         starsX[i] -= starsSpeed[i];
         if (starsX[i] < 0)
             starsX[i] = Width;

         // draw i-th star
         gr.FillEllipse(Brushes.Silver, starsX[i], starsY[i], starsSize[i], starsSize[i]);              
     }
 }

Полный код примера можно посмотреть здесь


Упражнения:

1. Рефакторинг: Убрать все числовые строки в программе и сделать их константами с осмысленными названиями

2. Переделать программу на ООП. Убрать 4 массива и ввести один новый класс звезда Star. Переделать программу с процедурного стиля на ООП.