Мне нужно выбить быструю анимацию в C# / Windows Forms для отображения Хэллоуина. Просто несколько 2D-фигур, движущихся по сплошному фону. Поскольку это всего лишь быстрый разовый проект, я В самом деле не хочу устанавливать и изучать для этого целый новый набор инструментов. (Наборы для разработчиков DirectX, Silverlight, Flash и т. д.). Я также должен установить это на несколько компьютеров, чтобы все, что выходит за рамки базовой .Net framework (2.0), было бы головной болью.
Что касается инструментов, у меня есть VS2k8, 25 лет опыта разработки, тачка, маскировка холокоста и около 2 дней, чтобы разобраться с этим. Я не делал анимацию с тех пор, как использовал ассемблер на моем Atari 130XE (ура для перелистывания страниц и графики игрока / ракеты!)
Совет? Вот что я хотел бы знать:
Спасибо.
Посмертное редактирование ... "через пару дней кодирования"
Что ж, проект готов. Приведенные ниже ссылки пригодились, хотя некоторые из них были 404. (я бы хотел, чтобы SO позволил пометить более одного ответа как «правильный»). Самой большой проблемой, которую мне пришлось преодолеть, было мерцание и постоянная ошибка, когда я пытался рисовать прямо в форме.
Установка всех параметров «двойной буферизации» в форме по-прежнему оставляла некоторое мерцание, которое необходимо было исправить. (И я нашел противоречивые документы, в которых говорилось «установить их в элементе управления» и «установить их в форме». У элементов управления нет метода .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 изнутри цикла таймера. Никакого мерцания.
В идеале вы должны повторно использовать Bitmap в своем коде в каждом кадре, если ширина и высота не меняются. Распределять его каждый кадр расточительно. Он также должен быть удален по завершении, как и возвращаемое значение pf.CreateGraphics().





Установите таймер с желаемой частотой кадров. При каждом срабатывании таймера вращайте внутреннее представление фигур на экране (вашу модель) в соответствии с движением анимации, которое вы хотите достичь, затем вызывайте Invalidate(true). Внутри OnPaint просто нарисуйте модель на экране.
Ах да, и вы, вероятно, захотите включить двойную буферизацию (это похоже на автоматическое перелистывание страниц).
Оба они дают хорошие примеры анимации. Код довольно прост. Я использовал их, когда мне нужно было сделать быструю анимацию для моего сына.
см. соответствующий вопрос простой анимации в winforms.