Programmer
|
| Wed Nov 12 10:32:18 2003 |
Re: Быстрый 2D движок для VB Короче создаем игровой экран посредством помещения двух элементов одинакового размера и с одинаковыми координатами на форме (Form1) типа PictureBox друг над другом. Тот, что сзади и будет буферным экраном. Называем его, к примеру, BD и задаем его свойства: BD.AutoRedraw=true BD.BackColor=0 - черный BD.BorderStyle=0 BD.ScaleMode=3 - пиксель BD.Visible=false Тот, что впереди обзываем FD и его свойства: BD.AutoRedraw=false BD.BackColor - белый BD.ScaleMode=3 Теперь создаем общий модуль и декларируем API-функцию: Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal xDest As Long, ByVal yDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Теперь о спрайтах, то есть графических 2D-объектах. Описываемый движок поддерживает любые графические форматы, которые поддерживает VisualBasic, из основных это .ico, .gif и .bmp. Но BitBlt не поддерживает прозрачные фоны, она переносит все то, что видит в переданной области. Поэтому необходимо передавать пары: изображение-маска. Вот и рисуем в каком-нибудь bmp-файле нужный графический объект во всех положениях. Применимо к примерам нижеследующих функций необходимо рисовать на белом фоне спрайты размером 100x100 пикселей так, что каждый спрайт располагается в своей строке, в левом столбце собственно изображение на белом фоне, а в правом маска, на которой контур этого изображения: все, что должно быть прозрачным - черное, непрозрачным - белое, то есть как-бы рисуем на черном фоне белой краской. Если, к примеру, я хочу сделать 4 спрайта размером 100x100px, то наш BMP будет размером 200x400px (ширинаxвысота). Когда рисунок готов нужно создать новую форму (Form2), которую мы никогда показывать не будем, но на ней будем хранить спрайты. Ставим на нее PictureBox под названием Spr и задаем свойства: Spr.AutoRedraw=true Spr.AutoSize=true Spr.BackColor - белый Spr.Picture - наш рисунок Spr.ScaleMode=3 А теперь в тот модуль, где мы продекларировали API-функцию, вставляем следующие процедуры: Public Sub BufferDraw(BufferDisplayhDC As Long, xDraw As Long, yDraw As Long, SrcSpritehDC As Long, StrNoSprite As Integer) 'Заполнение буфферного экрана On Error Resume Next BitBlt BufferDisplayhDC, xDraw, yDraw, 100, 100, SrcSpritehDC, 100, 100 * StrNoSprite, vbSrcPaint BitBlt BufferDisplayhDC, xDraw, yDraw, 100, 100, SrcSpritehDC, 0, 100 * StrNoSprite, vbSrcAnd End Sub Public Sub Draw(FrontDisplay As PictureBox, BufferDisplay As PictureBox) 'Перенос из буфера на основной экран On Error Resume Next BitBlt FrontDisplay.hDC, 0, 0, FrontDisplay.ScaleWidth, FrontDisplay.ScaleHeight, BufferDisplay.hDC, 0, 0, vbSrcCopy End Sub Public Sub CutDraw(BufferDisplayhDC As Long, xDraw As Long, yDraw As Long, SrcSpritehDC As Long, StrNoSprite As Integer, SrcHolehDC As Long, StrNoHole As Integer) 'Это работа с буфером, если в каком-нибудь фоне надо вырезать дырку (сюда нужно передавать только маску) On Error Resume Next BitBlt BufferDisplayhDC, xDraw, yDraw, 100, 100, SrcHolehDC, 0, 100 * StrNoHole, vbSrcPaint BitBlt BufferDisplayhDC, xDraw, yDraw, 100, 100, SrcSpritehDC, 0, 100 * StrNoSprite, vbSrcAnd End Sub Public Sub FonDraw(BufferDisplay As PictureBox, xDraw As Long, yDraw As Long, SrcSprite As PictureBox) 'А это рисует общий фон On Error Resume Next BitBlt BufferDisplay.hDC, xDraw, yDraw, SrcSprite.ScaleWidth, SrcSprite.ScaleHeight, SrcSprite.hDC, 0, 0, vbSrcCopy End Sub В общем-то все эти процедуры можно модифицировать под себя. Чтобы пояснить как работает модуль создадим процедуру рисования спрайта №2 в модуле Form1 в позициях X=232, Y=301: Private Sub Draw() BD.Cls 'Очищаем буфер перед рисованием. Вместо этого можно нарисовать фон посредством процедуры FonDraw BufferDraw BD.hDC, 232, 301, Form2.Spr.hDC, 1 'Передаем номер процесса буферного PictureBox, координаты X и Y, номер процесса PictureBox со спрайтами и номер спрайта (от 0) Draw FD, BD 'Переносим все из буфера на видимый экран End Sub Теперь никакого мелькания не будет, и все будет работать плавно и красиво.
|
|