Звезды 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);
}
}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. Переделать программу с процедурного стиля на ООП.