Валерий Алексеевич Жарков

Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 4: Программирование на Visual Basic искусственного интеллекта


Скачать книгу

рис. 4.7. Однако изображения и сыра, и хлеба мерцают, что необходимо исправить методом двойной буферизации (в следующем параграфе).

      4.6. Методика устранения мерцания изображения при помощи двойной буферизации

      Идея устранения мерцания изображения методом двойной буферизации заключается в том, что сначала изображение проектируют не на экране, как до применения двойной буферизации, а в специальном буфере в памяти компьютера, а когда изображение полностью спроектировано в буфере памяти, оно копируется на экран . Так как процесс копирования готового изображения из буфера на экран происходит быстрее, чем процесс прорисовки изображения сразу на экране без использования промежуточного буфера, то мерцание изображения исчезает.

      Чтобы устранить мерцание изображения при помощи двойной буферизации, приведённый выше код в теле метода Form1_Paint заменяем на тот, который дан на следующем листинге (с подробными комментариями).

      Рис. 4.7. Подвижный сыр и неподвижный хлеб.

      Рис. 4.8. Сыр закрывает хлеб.

      Листинг 4.10. Метод для рисования изображения.

      'Буфер в виде объекта класса Bitmap:

      Dim backBuffer As Bitmap = Nothing

      Private Sub Form1_Paint(ByVal sender As System.Object, _

      ByVal e As System.Windows.Forms.PaintEventArgs) _

      Handles MyBase.Paint

      'Загружаем в объект класса System.Drawing.Image

      'добавленный в проект файл изображения заданного формата

      'при помощи потока встроенного ресурса (ResourceStream):

      cheeseImage = _

      New Bitmap(myAssembly.GetManifestResourceStream( _

      myName_of_project + "." + "cheese.JPG"))

      breadImage = _

      New Bitmap(myAssembly.GetManifestResourceStream( _

      myName_of_project + "." + "bread.JPG"))

      'Если необходимо, создаём новый буфер:

      If (backBuffer Is Nothing) Then

      backBuffer = New Bitmap(Me.ClientSize.Width, _

      Me.ClientSize.Height)

      End If

      Using g As Graphics = Graphics.FromImage(backBuffer)

      'Очищаем форму:

      g.Clear(Color.White)

      'Рисуем изображение в буфере backBuffer:

      g.DrawImage(breadImage, bx, by)

      g.DrawImage(cheeseImage, cx, cy)

      End Using

      'Рисуем изображение на форме Form1:

      e.Graphics.DrawImage(backBuffer, 0, 0)

      'Включаем таймер:

      Timer1.Enabled = True

      End Sub

      Если мы сейчас запустим программу на выполнение, то увидим, что мерцание уменьшилось, но не исчезло совсем. Это объясняется тем, что при выполнении метода Form1_Paint операционная система Windows сначала заполняет экран цветом фона (background color), в нашем примере белым фоном (white), и только после этого поверх фона прорисовывает встроенные в программу изображения. Поэтому необходимо сделать так, чтобы операционная система Windows не изменяла фон. Для этого воспользуемся неоднократно применяемым и в наших предыдущих книгах, и в данной книге шаблоном метода OnPaintBackground, в тело которого мы ничего не будем записывать, как показано на следующем листинге.

      Листинг 4.11. Метод OnPaintBackground.

      Protected Overrides Sub OnPaintBackground( _

      ByVal e As System.Windows.Forms.PaintEventArgs)

      'Запрещаем перерисовывать фон (Background).

      End Sub 'Конец метода OnPaintBackground.

      Этот метод OnPaintBackground следует записать непосредственно за методом Form1_Paint, естественно, в теле класса Form1.

      Теперь в режиме выполнения (Build, Build Selection; Debug, Start Without Debugging) подвижный сыр и неподвижный хлеб уже не мерцают, и мы решили данную задачу.

      Однако при перемещении сыр может перекрыть батон хлеба (рис. 4.8), хотя по правилам игры пользователь должен управлять перемещением хлеба, не давая сыру упасть вниз, а маленький кусочек сыра при столкновении должен отскочить от большого батона