25 декабря 2012 г.

Основы анимации в WinForms

Проще всего двухмерную игру на .NET можно написать, используя стандартную технологию WinForms. Будем отображать графику на всей поверхности формы. Для этого сначала надо получить поверхность рисования GDI+ в виде объекта Graphics.

Graphics graphics = this.CreateGraphics();

this в данном случае представляет собой объект формы. Сам объект Graphics предоставляет богатый набор методов для рисования линий, кругов, прямоугольников и т.п. Причём вы можете задать, каким цветом рисовать фигуру, заливать ли её цветом всю или только границы фигуры. Также фигуру можно заполнить текстурой (повторяющимся изображением).

Всю эту отрисовку следует выполнять в событии формы OnPaint. Тогда, при перемещении самой формы или изменении её размеров, графика будет перерисовываться автоматически.

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

Однако в случае перерисовки по таймеру изображение начинает мерцать. Чтобы избежать мерцания изображения, нужно использовать BufferedGraphicsContext - графический буфер для двойной буферизации. Пример:

public Form1()
{
InitializeComponent();
Graphics graphics = this.CreateGraphics();            
bufferedGraphicsContext = new BufferedGraphicsContext();
bufferedGraphics = bufferedGraphicsContext.Allocate(graphics, new Rectangle(0, 0, this.Width, this.Height));
}

В конструкторе мы создаём буфер для всей поверхности рисования нашей формы. Далее по таймеру вызываем отрисовку изображения:

private void tmr_Tick(object sender, EventArgs e)
{
// здесь рисуем само изображение
bufferedGraphics.Graphics.Clear(Color.White);
engine.Draw(bufferedGraphics.Graphics, this.Size);
bufferedGraphics.Render();
}

Такая схема позволяет избежать мерцания при отрисовке изображения.

2 комментария:

  1. Ответы
    1. Если вкратце, то это любой метод, принимающий объект Graphics и реализующий, собственно, логику рисования (линии, круги, прямоугольники, картинки и т.п.).

      Удалить