Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Графическая реализация проекта


Автор: СВА 9.1.2006, 06:59
Суть вопроса такова, допустим я собрался сделать игрушку что-то отдаленно напоминающее Dune II. Математическая модель готова.
Теперь сам вопрос как можно сделать графическую реализацию, ведь нужно нарисовать поле на нем декорации и объекты при этом обеъекты могут двигаться и желательно плавно. Я пробовал каждый раз перерисовывать кдры, но используя функции Bitblt или чтото в этом роде на перерисовку кждого кадра уходит много времени зачастую до 1 секунды и конечно об анимации можно было забыть.

Так вот возможны ли другие способы прорисовывать кадры если да то как

Автор: ~FoX~ 9.1.2006, 13:02
Ну как водиться вариантов то море от DX и OpenGL до написания собственного двигла.... smile
Но ИМХО плоскую графику вполне потянут и стандартные АПИ
Глянь тут:
http://vingrad.ru/VB-ART-002308
Изображения достаточно большого размера обрабатываются оч шустренько.

Автор: KEKCCCP 9.1.2006, 14:32
ИМХО ИМХО ИМХО smile smile

Не надо никаких API для токого. Зачем усложнять себе жизнь? То ж самое получается. smile
Рисовать надо на *.picture при чём *.AutoRedraw = True, чтобы графика не мигала.
Все картинки полей и всяких там юнитов загружаем в массив PictureBox'ов. picP(*).picture = loadpicture(...), чтобы вообще ничего не тормозило (и у всех эл. массива *.AutoSize = True)!
Чтобы нарисовать прозрачную картику (к примеру, с фоном vbRed), надо делать так:
TBLT Form1.hDC, 0, 0, picP(*).Width, picP(*).Height, picP(*).hDC, 0, 0, picP(*).Width, picP(*).Height, vbRed

При этом в модуле объяви:
Declare Function TBLT Lib "Msimg32.dll" Alias "TransparentBlt" ( _
ByVal hdcDest As Long, ByVal nXOriginDest As Long, _
ByVal nYOriginDest As Long, ByVal nWidthDest As Long, _
ByVal nHeightDest As Long, ByVal hdcSrc As Long, _
ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, _
ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, _
ByVal crTransparent As Long) As Boolean

Для не прозр. можно исп.
Form1.PaintPicture ...

Автор: Exception 9.1.2006, 14:45
В сложных проектах DX rulz.

Автор: СВА 10.1.2006, 05:59
Цитата

Для не прозр. можно исп.
Form1.PaintPicture ...


В своем проекте я так и делал и при разрешении экрана 600*800 точек эта функция работает очень медленно и достичь смены кадров хотя бы 20 в сек. невозможно.

насчет DX у меня стоит 9.1 и если я не ошибаюсь уже с 8-й версии там нет работы с 2D графикой.

на многих форумах говорится что VB и OpenGL не созданы друг для друга

Автор: ~FoX~ 10.1.2006, 10:25
Цитата(СВА @ 10.1.2006, 06:59 Найти цитируемый пост)

DX у меня стоит 9.1 и если я не ошибаюсь уже с 8-й версии там нет работы с 2D графикой.

Ты сам то понял, что сказал? smile
Ладно не морочься.....http://directx-vb.narod.ru/DXGraphics/Tutorial1.htm глянь.
И http://forum.vingrad.ru/index.php?showtopic=27371

Цитата(KEKCCCP @ 9.1.2006, 15:32 Найти цитируемый пост)

Не надо никаких API для токого. Зачем усложнять себе жизнь?

А это не АПИ?
Цитата(KEKCCCP @ 9.1.2006, 15:32 Найти цитируемый пост)

При этом в модуле объяви:
Declare Function TBLT Lib "Msimg32.dll" Alias "TransparentBlt"

Автор: СВА 12.1.2006, 07:42
ладно остановимся на DX

его нужно подключать к проекту или нет

Автор: ~FoX~ 12.1.2006, 17:05
Цитата

Ладно не морочься.....http://directx-vb.narod.ru/DXGraphics/Tutorial1.htm глянь.
И http://forum.vingrad.ru/index.php?showtopic=27371

smile smile

Автор: СВА 15.1.2006, 06:20
я так понял дело мне придется иметь с DirectDraw. Ни кто не видел хоть какой нибудь пример для работы с ним. Покажите хоть какую нибудь ссылочку, пожалуйста.

Автор: ~FoX~ 16.1.2006, 08:44
СВА
На, http://www.firststeps.ru/mfc/directx/directx1.html очь простая и интересная статья на тему ДиректДвров

Автор: СВА 17.1.2006, 06:00
статьии я видел мне хотя бы один пример, пожалуйста

Автор: ~FoX~ 17.1.2006, 09:04
Код

Option Explicit 'описываем необходимые структуры
Dim dx As New DirectX7
Dim dd As DirectDraw7
Dim di As DirectInput

Dim diDev As DirectInputDevice
Dim diState As DIKEYBOARDSTATE

Dim Prim As DirectDrawSurface7
Dim PrimBufer As DirectDrawSurface7
Dim OsnovaBMP As DirectDrawSurface7
Dim SpriteBMP As DirectDrawSurface7

Dim ddsdPrim As DDSURFACEDESC2
Dim ddsdPrimBufer As DDSURFACEDESC2
Dim ddsdOsnovaBMP As DDSURFACEDESC2
Dim ddsdSpriteBMP As DDSURFACEDESC2
Dim ddsdcapsPrimBufer As DDSCAPS2

Dim Key As DDCOLORKEY

Private Sub Form_Load()
'Инициализируем объекты и структуры
Set dd = dx.DirectDrawCreate("")
Set di = dx.DirectInputCreate()
Set diDev = di.CreateDevice("GUID_SysKeyboard")

dd.SetCooperativeLevel Me.hwnd, DDSCL_FULLSCREEN _
Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE
dd.SetDisplayMode 800, 600, 16, 0, DDSDM_DEFAULT

diDev.SetCommonDataFormat (DIFORMAT_KEYBOARD)
diDev.SetCooperativeLevel Form1.hwnd, DISCL_NONEXCLUSIVE _
Or DISCL_BACKGROUND
diDev.Acquire

ddsdPrim.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsdPrim.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE _
Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
ddsdPrim.lBackBufferCount = 1
Set Prim = dd.CreateSurface(ddsdPrim)

ddsdcapsPrimBufer.lCaps = DDSCAPS_BACKBUFFER
Set PrimBufer = Prim.GetAttachedSurface(ddsdcapsPrimBufer)
PrimBufer.GetSurfaceDesc ddsdPrimBufer

ddsdOsnovaBMP.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
ddsdOsnovaBMP.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
ddsdOsnovaBMP.lWidth = 800 'ddsdPrimBufer.lWidth
ddsdOsnovaBMP.lHeight = 600 'ddsdPrimBufer.lWidth

Set OsnovaBMP = dd.CreateSurfaceFromFile("c:\1.bmp", ddsdOsnovaBMP) 'Загружаем первый буфер

ddsdSpriteBMP.lFlags = DDSD_CAPS
ddsdSpriteBMP.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
Set SpriteBMP = dd.CreateSurfaceFromFile("c:\2.bmp", ddsdSpriteBMP) 'Загружаем второй буфер

Key.low = 0
Key.high = 0
SpriteBMP.SetColorKey DDCKEY_SRCBLT, Key
Dim Kvadrat As RECT
Dim Kvadrat1 As RECT
Kvadrat.Top = 0
Kvadrat.Left = 0
Kvadrat.Bottom = 600 'ddsdPrimBufer.lHeight
Kvadrat.Right = 800 'ddsdPrimBufer.lWidth
Kvadrat1.Top = 0
Kvadrat1.Left = 0
Kvadrat1.Bottom = ddsdSpriteBMP.lHeight
Kvadrat1.Right = ddsdSpriteBMP.lWidth
PrimBufer.BltFast 0, 0, OsnovaBMP, Kvadrat, DDBLTFAST_WAIT
PrimBufer.BltFast 0, 0, SpriteBMP, Kvadrat1, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT
Prim.Flip Nothing, DDFLIP_WAIT
End Sub

Private Sub Timer1_Timer()
Dim iKeyCounter As Integer
Dim Kvadrat As RECT
Dim Kvadrat1 As RECT
Kvadrat.Top = 0
Kvadrat.Left = 0
Kvadrat.Bottom = 600 'ddsdPrimBufer.lHeight
Kvadrat.Right = 800 'ddsdPrimBufer.lWidth
Kvadrat1.Top = 0
Kvadrat1.Left = 0
Kvadrat1.Bottom = ddsdSpriteBMP.lHeight
Kvadrat1.Right = ddsdSpriteBMP.lWidth
diDev.GetDeviceStateKeyboard diState
If diState.Key(2) Then '1'<> 0 Then
PrimBufer.BltFast 0, 0, OsnovaBMP, Kvadrat, DDBLTFAST_WAIT
PrimBufer.BltFast 100, 100, SpriteBMP, Kvadrat1, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT
Prim.Flip Nothing, DDFLIP_WAIT
End If
If diState.Key(3) Then '1'<> 0 Then
PrimBufer.BltFast 0, 0, OsnovaBMP, Kvadrat, DDBLTFAST_WAIT
PrimBufer.BltFast 0, 0, SpriteBMP, Kvadrat1, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT
Prim.Flip Nothing, DDFLIP_WAIT
End If
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 27 Then
diDev.Unacquire
dd.RestoreDisplayMode
dd.SetCooperativeLevel Me.hWnd, DDSCL_NORMAL
End
End If
End Sub


Полное описание http://vbstreets.ru/VB/Articles/65965.aspx

Автор: СВА 18.1.2006, 05:55
~FoX~ ты меня не совсем понял, мне нужна ссылка на проект, а не на код, который ссылается на картинки, неимеющихся у меня

Автор: ~FoX~ 18.1.2006, 09:19
СВА
А немножко усилий приложить? smile
Тебе же все равно их придется рисовать. И все равно придется с кодом разбираться.
За тебя писать никто не будет, по крайней мере бесплатно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)