然后设置DirectDraw得显示模式
| Call DDraw.SetDisplayMode(800, 600, 16, 0, CONST_DDSDMFLAGS.DDSDM_DEFAULT) | 800,600表示屏幕尺寸,16表示16位真彩
然后定义缓存用于存储图片
Dim ddsPrimary As DirectDrawSurface7 '设置主面
Dim ddsBackBuffer As DirectDrawSurface7 '设置缓冲面
Public ddsMap As DirectDrawSurface7'设置地图
Public ddsHero As DirectDrawSurface7'设置人物
'定义设置表面
Dim ddsd As DDSURFACEDESC2 '表面
'为屏幕建立一个后备缓冲区
ddsd1.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or CONST_DDSURFACEDESCFLAGS.DDSD_BACKBUFFERCOUNT
ddsd1.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_PRIMARYSURFACE Or CONST_DDSURFACECAPSFLAGS.DDSCAPS_FLIP Or CONST_DDSURFACECAPSFLAGS.DDSCAPS_COMPLEX
ddsd1.lBackBufferCount = 1
ddsPrimary = DDraw.CreateSurface(ddsd1)
'设置后备缓冲区
Dim caps As DDSCAPS2
caps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_BACKBUFFER
ddsBackBuffer = ddsPrimary.GetAttachedSurface(caps)
ddsBackBuffer.GetSurfaceDesc(ddsd4)
'载入画面初始化
ddsd2.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or CONST_DDSURFACEDESCFLAGS.DDSD_HEIGHT Or CONST_DDSURFACEDESCFLAGS.DDSD_WIDTH
ddsd2.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN
ddsd2.lWidth = ddsd4.lWidth
ddsd2.lHeight = ddsd4.lHeight
'读取地图
ddsMap = DDraw.CreateSurfaceFromFile("Map\001.bmp", ddsd2)
'载入精灵
ddsd3.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS
ddsd3.lHeight = CONST_DDSURFACEDESCFLAGS.DDSD_ALL
ddsd3.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN
'读取人物
ddsHero = DDraw.CreateSurfaceFromFile("BMP\H00.bmp", ddsd3)
'把人物从背景中抠出来,用Key设置背景色
Dim key As DDCOLORKEY
'这里的背景色为黑色
key.low = 0
key.high = 0
ddsHero.SetColorKey(CONST_DDCKEYFLAGS.DDCKEY_SRCBLT, key)
'在后备缓存中绘制地图
Dim rMap As RECT
ddsBackBuffer.BltFast(0, 0, Map.ddsMap, rMap, CONST_DDBLTFASTFLAGS.DDBLTFAST_WAIT)
'在后备缓存中绘制人物
Dim rPlayer As RECT
Dim ddrval As Boolean
'rPlayer表示从图片中截取那块,从哪到哪。如果你打开很多游戏的位图看看的话你会发现一个人物的多种动态往往放在一张位图中,截取其中的不同块显示出来就形成了动画。
'表示从(0,0)这个位置开始取
rPlayer.Top = 0
rPlayer.Left = 0
'表示取到(32,32)这个位置
rPlayer.Right = 32
rPlayer.Bottom = 32
'其中0,0表示绘制的位置。
ddrval = ddsBackBuffer.BltFast(0, 0, ddsHero, rPlayer, CONST_DDBLTFASTFLAGS.DDBLTFAST_SRCCOLORKEY Or CONST_DDBLTFASTFLAGS.DDBLTFAST_WAIT)
'好了,后备缓存已经绘制完成了,可以翻转过来了,其实写屏的方法就是不停的翻转主面和缓存面
ddsPrimary.Flip(Nothing, CONST_DDFLIPFLAGS.DDFLIP_WAIT) |
|
|