Подтвердить что ты не робот

Простая анимация с использованием С#/Windows Forms

Мне нужно выбить быструю анимацию в С#/Windows Forms для отображения Хэллоуина. Просто некоторые 2D-фигуры движутся по сплошному фону. Поскольку это всего лишь быстрый одноразовый проект, я на самом деле не хочу устанавливать и изучать весь новый набор инструментов для этого. (DirectX dev kit, Silverlight, Flash и т.д.). Я также должен установить это на нескольких компьютерах, чтобы все, что было за пределами основной .Net framework (2.0), было бы болью в заднице.

Для инструментов у меня есть VS2k8, 25-летний опыт разработки, тачка, плащ-заклинание и около 2 дней, чтобы выбить это. Я не делал анимацию с тех пор, как использовал ассемблер на Atari 130XE (hooray для перелистывания страницы и игровой/ракетной графики!)

Советы? Вот некоторые из вещей, которые я хотел бы знать:

  • Я могу нарисовать любой пустой виджет (например, панель), поиграв с обработчиком OnPaint, правильно? Это то, как я нарисовал пользовательский виджет. Есть ли лучшая техника, чем эта?
  • Есть ли способ перетаскивания страниц для такого рода вещей в Windows Forms? Я не ищу высокую частоту кадров, так же, как мало мерцание/рисование по мере необходимости.

Спасибо.

Опубликовать Mortem Edit... "пару дней кодирования"

Ну, проект сделан. Ссылки, приведенные ниже, пригодились, хотя пара из них была 404. (Я бы хотел, чтобы SO позволял отмечать "правильный" более одного ответа). Самая большая проблема, которую мне пришлось преодолеть, - мерцание и постоянная ошибка, когда я попытался нарисовать форму напрямую.

  • Использование события OnPaint для формы: плохая идея. У меня никогда не было на работу; много загадочных ошибок (переполнение стека, или ArgumentNullExceptions). Я закончил с помощью панели размером, чтобы заполнить форму, и она отлично работала.
  • Использование метода OnPaint в любом случае медленное. Где-то в Интернете я читал, что строительство PaintEventArgs было медленным, и они не шутили. Когда я отказался от этого, многие мерцали. Пропустите OnPaint/Invalidate() и просто нарисуйте его самостоятельно.
  • Установка всех параметров "двойной буферизации" в форме по-прежнему оставила некоторое мерцание, которое должно было быть исправлено. (И я нашел противоречивые документы, которые сказали "установить их на элементе управления" и "установить их в форме". Элементы управления Well не имеют метода .SetStyle().) Я не тестировал без них, поэтому они могут быть что-то (this - это форма):

        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    

Таким образом, рабочая лошадь кода, выглядящая как (pf - панель управления):

    void PaintPlayField()
    {
        Bitmap bufl = new Bitmap(pf.Width, pf.Height);
        using (Graphics g = Graphics.FromImage(bufl))
        {
            g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height));
            DrawItems(g);
            DrawMoreItems(g);
            pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0);
        }
    }

И я только что назвал PaintPlayField изнутри цикла Timer. Нет мерцания вообще.

4b9b3361

Ответ 1

Установите таймер с нужной частотой кадров. На каждом таймере запускается внутреннее представление фигур на экране (ваша модель) на движение анимации, которое вы хотите достичь, затем вызовите Invalidate(true). Внутри OnPaint просто нарисуйте модель на экране.

О да, и вы, вероятно, захотите включить Double Buffering (это похоже на автоматическое переключение страницы).

Ответ 2

2d Game Primer

Анимация на основе таймера

Оба они дают хорошие примеры анимации. Код довольно прост. Я использовал их, когда мне нужно было сделать быструю анимацию для моего сына.