Анимировать несколько прыгающих мячей в C#

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

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

...

Следующий код показывает, как программа инициализирует свои данные шарика.

// Некоторые параметры рисования.
private Rectangle[] BallLocation;
private Point[] BallVelocity;
private Size FormSize;

// Инициализируйте некоторые случайные вещи.
private void Form1_Load(object sender, EventArgs e)
{
    // Делаем случайные шары.
    Random rand = new Random();
    const int num_balls = 10;
    BallLocation = new Rectangle[num_balls];
    BallVelocity = new Point[num_balls];
    for (int i = 0; i < num_balls; i++)
    {
        int width = rand.Next(10, 40);
        BallLocation[i] = new Rectangle(
            rand.Next(0, ClientSize.Width - 2 * width),
            rand.Next(0, ClientSize.Height - 2 * width),
            width, width);
        int vx = rand.Next(2, 10);
        int vy = rand.Next(2, 10);
        if (rand.Next(0, 2) == 0) vx = -vx;
        if (rand.Next(0, 2) == 0) vy = -vy;
        BallVelocity[i] = new Point(vx, vy);
    }

    // Сохраните размер формы.
    FormSize = ClientSize;

    // Используйте двойную буферизацию для уменьшения мерцания.
    this.SetStyle(
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.UserPaint |
        ControlStyles.DoubleBuffer,
        true);
    this.UpdateStyles();
}

Следующий код перемещает шары, когда таймер программы запускает событие Tick.

// Перемещение шаров и обновление.
private void tmrMoveBall_Tick(object sender, EventArgs e)
{
    for (int ball_num = 0;
        ball_num < BallLocation.Length;
        ball_num++)
    {
        // Переместите мяч.
        int new_x = BallLocation[ball_num].X +
            BallVelocity[ball_num].X;
        int new_y = BallLocation[ball_num].Y +
            BallVelocity[ball_num].Y;
        if (new_x < 0)
        {
            BallVelocity[ball_num].X = -BallVelocity[ball_num].X;
            Boing();
        }
        else if (new_x + BallLocation[ball_num].Width >
            FormSize.Width)
        {
            BallVelocity[ball_num].X = -BallVelocity[ball_num].X;
            Boing();
        }
        if (new_y < 0)
        {
            BallVelocity[ball_num].Y = -BallVelocity[ball_num].Y;
            Boing();
        }
        else if (new_y + BallLocation[ball_num].Height >
            FormSize.Height)
        {
            BallVelocity[ball_num].Y = -BallVelocity[ball_num].Y;
            Boing();
        }

        BallLocation[ball_num] = new Rectangle(
            new_x, new_y,
            BallLocation[ball_num].Width,
            BallLocation[ball_num].Height);
    }

    Refresh();
}

В дополнение к обновлению положения каждого шара этот код также вызывает метод Boing для воспроизведения звука всякий раз, когда мяч касается одного из ребер формы. Вы можете захотеть прокомментировать эти вызовы (или закомментировать код в методе Boing), если вы собираетесь запустить программу много. Звуки забавные, но шумные.

Наконец, следующий код показывает, как программа перерисовывает свою поверхность после перемещения шаров.

// Нарисуем мяч в текущем местоположении.
private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    e.Graphics.Clear(BackColor);
    for (int i = 0; i < BallLocation.Length; i++)
    {
        e.Graphics.FillEllipse(Brushes.Blue, BallLocation[i]);
        e.Graphics.DrawEllipse(Pens.Black, BallLocation[i]);
    }
}

Источник: http://csharphelper.com/blog/2015/03/animate-several-bouncing-balls-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector