Форум / Программы / Тема

+ Список Разделы Темы Новая тема Ответить Ответ админа Удалить Открыть/Закрыть Чат Барахолка Каталог
Реклама

Быстрый 2D движок для VB

Статистика темы

Всего ответов в теме: 3
Просмотров темы: 2507

Леха
Ярославль  Thu Oct 16 10:06:12 2003
Пытаюсь создать игру на VB и пытался использовать метод PictureBox.PaintPicture. Однако этот метод вызывает сильное мерцание объектов. Может существует какой-то другой метод прорисовки, такой-же несложный как и PaintPicture?
Programmer
НеважноFri Oct 24 12:20:51 2003
Re: Быстрый 2D движок для VB
Существует. API функция BitBlt работает раз в 5 быстрее. Но если рисовать напрямую мелькание все-равно будет. Чтобы не было мелькания требуется рисовать на буфферном невидимом экране, а затем все это переносить на основной.
Леха
ЯрославльSun Oct 26 17:53:42 2003
Re: Быстрый 2D движок для VB
А как ей пользоваться? Я пробовал создавать буфер на основе PaintPicture, но он не содержит ничего в свойстве Picture на момент обращения и я ничего не могу с этим поделать :-(
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
Теперь никакого мелькания не будет, и все будет работать плавно и красиво.
Реклама
Карта сайта Created by Isety corp. (2005), Version: 1.0.2, Revision: 19.01.2007