VB编写DirectX程序.docx_第1页
VB编写DirectX程序.docx_第2页
VB编写DirectX程序.docx_第3页
VB编写DirectX程序.docx_第4页
VB编写DirectX程序.docx_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VB编写DirectX简明教程随这计算机软硬件的发展,计算机不在只是一个简单的计算工具而成为了一个可以玩游戏、进行多媒体操作的多功能平台。为了编写高性能的游戏和应用程序,我们需要绕过操作系统提供的API直接操作硬件以充分利用硬件的加速效果,但是由于现在的计算机配件数以万计,那么我们在编写程序时需要为每一类编写代码。这样就大大的浪费了资源。现在有了DirectX,这个问题就解决了,硬件厂家只要根据DirectX要求编写驱动程序,而程序员只要同单一的DirectX库打交道而基本不用顾及具体的硬件,这样不但大大的简化了编程而且也提高了程序性能。由于微软的影响力,DirectX库已经成为了游戏开发的标准之一。过去要进行DirectX开发只能使用复杂的C+,不过自从DirectX7发布以来,微软同时也发布了DirectX的VB开发库,这样我们业可以使用VB来开发基于DirectX的游戏和应用程序了。完整的DirectX7 SDK库有139M大,其中包括了VB、VC开发库,在线开发文档,范例程序以及一些实用程序。只有至少安装了开发库中的VB部分以后,才可以来开发DirectX程序。安装好DirectX开发库之后,打开VB,点击菜单的 Project | References 项打开References对话框,可以发现在列表中多了一项:DirectX 7 For Visual Basic Type library,点击该项,就可以把DirectX库加入到VB工程中。下面文章中编写每一个范例前都要首先进行上面的操作将DirectX 7 For Visual Basic Type library加入到VB工程中。DirectX7开发库是基于对象的,其中最基本的对象是DirectX7对象,只有在程序中首先建立了DirectX7对象之后才可以在该对象的基础上建立其它对象。DirectX基本对象包含以下几类:DirectDraw类 独立于设备的平面绘图对象,支持以全屏方式或者窗口方式绘图。DirectDraw支持对显存的直接操作。一旦定义DirectDraw对象并锁定,就可以象操作一个数组一样的操作显存中的内容了。Direct3D类 DirectX三维绘图接口,包括立即模式(Immediate Mode)和保留模式,是绝大部分的三维DirectX游戏的基础。Direct3D类对象独立于设备。DirectSound类 DirectX中的Wave音频对象,独立于设备,支持混音、硬件加速、直接设备访问、声音捕捉和回放。DirectMusic类 音乐数据文件操作对象,支持DLS(downloadable sounds)标准,支持运行时编辑。DirectInput类 独立于设备的游戏控制器对象,支持鼠标、键盘、游戏杆,并且支持力反馈游戏杆。DirectPlay类 为支持多任游戏而设计的对象,支持不同的计算机通过网络、Internet或者Modem进行互连。支持建立游戏服务器,用户可以登陆到服务器上并纪录用户信息。可以协调速度不同的计算机之间的信息传递(例如一个使用专线和一个使用低速Modem的计算机之间)。一、 DirectDrawDirectDraw类是DirectX中绘图的基础,它包含以下的对象:DirectDraw7 DirectDrawClipper DirectDrawEnumModes DirectDrawPalette DirectDrawSurface7 DirectDraw7是基本的DirectDraw类对象,它是建立其它对象的基础,DirectDraw7对象要通过DirectX7对象的DirectDrawCreate方法来建立。例如下面的语句就可以建立一个DirectDraw对象:Dim objDx As New DirectX7Dim objDraw As DirectDraw7Set objDx = New DirectX7DirectDrawClipper对象可以建立一个屏幕的剪裁区域的列表。该对象的一个通常的应用是设置屏幕或者窗口区域,例如在你的游戏中有一个人物移动到了屏幕的边缘,你不希望他一下消失掉而是要平滑的移出,如果没有DirectDrawClipper对象的话这将后台的图像复制到前台会出现错误,因为人物图像的一部分已经移动到了绘图平面的外面,而有了DirectDrawClipper对象,DirectDraw就知道人物图像区域的那些部分是可见的而那些部分应该被剪裁掉。利用DirectDraw7的CreateClipper方法可以建立一个DirectDraw7下的DirectDrawClipper对象通过DirectDrawEnumModes对象可以获得当前系统支持的显示模式。DirectDraw7的GetDisplayModesEnum方法可以建立一个DirectDrawEnumModes对象。DirectDrawPalette对象是DirectDraw下的绘图调色板对象,它很类似于Windows下的调色板。DirectDraw7的CreatePalette方法可以建立一个DirectDrawPalette对象。DirectDrawSurface7是DirectDraw下的最重要的对象,它有点类似Windows下窗口的hDC,我们所进行的所有图形、文本操作都是在这个对象上进行的。这个对象描述了一块线型的显存区域,你可以通过DirectDrawSurface7对象直接操作这片区域。如果你还记得在Dos下的QB4.5编写图形程序的话,DirectDrawSurface7对象就同它有一些类似。通过DirectDraw7的CreateSurface方法,你可以建立一个单一绘图平面、复合绘图平面或者三维绘图平面对象。而利用DirectDraw7的CreateSurfaceFromFile方法、CreateSurfaceFromResource方法可以建立一个包含位图的 DirectDrawSurface7对象。DirectDrawSurface7对象是DirectDraw类对象中最难掌握的对象。下面我们将通过建立一个简单的DirectDraw程序并通过充实程序来学习DirectDraw的基本原理和应用。首先来建立一个简单的DirectDraw程序,建立一个新的工程,将Direct7说明库加入到工程中,然后在Form1中加入两个CommandButton和一个ListBox控件,在Form1中加入以下代码:Option ExplicitDim objDx As New DirectX7Dim objDraw As DirectDraw7Dim objEnumModes As DirectDrawEnumModesSub Cleanup() Cleanup函数回复屏幕并且清除DirectX对象 Call objDraw.RestoreDisplayMode Call objDraw.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL) Set objDraw = Nothing Set objDx = Nothing EndEnd SubPrivate Sub Command1_Click() CleanUpEnd SubPrivate Sub Form_Load() Command1.Caption = 结束 Command2.Caption = 设置显示模式 On Error GoTo ErrHandler: Dim ddsd As DDSURFACEDESC2 Dim I As Long, lgCount As Long Set objDx = New DirectX7 建立 DirectDraw 对象 Set objDraw = objDx.DirectDrawCreate() 将DirectDraw对象支持的显示模式设置到DirectDrawEnumModes对象中 Set objEnumModes = objDraw.GetDisplayModesEnum(DDEDM_DEFAULT, ddsd) 将数据设置到ListBox中 lgCount = objEnumModes.GetCount() For I = 1 To lgCount objEnumModes.GetItem I, ddsd List1.AddItem CStr(ddsd.lWidth) & x & CStr(ddsd.lHeight) & x _ & CStr(ddsd.ddpfPixelFormat.lRGBBitCount) Next IErrHandler:Select Case Err.Number Case 0 没有错误 Case Else Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _ Err.HelpContext Call Cleanup End SelectEnd SubPrivate Sub Form_Unload(Cancel As Integer) CleanupEnd Sub程序的运行结果如下图:上面的范例首先演示了如何建立一个简单的DirectDraw对象并获得该对象支持的显示模式。下面我们要将在原来程序的基础上添加一些模块以实现更多的功能。首先在上面的程序中加入一个函数SetNewDisplayMode,函数代码如下:Private Function SetNewDisplayMode() On Error GoTo ErrHandler Dim ddsd As DDSURFACEDESC2 Dim i As Long i = List1.ListIndex If i = -1 Then MsgBox 请在列表中选择一种显示模式, vbOKOnly, 错误 Exit Function End If objEnumModes.GetItem (i + 1), ddsd 设置协作模式 objDraw.SetCooperativeLevel Me.hWnd, DDSCL_FULLSCREEN Or _DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE 设置显示模式 objDraw.SetDisplayMode ddsd.lWidth,ddsd.lHeight, _ddsd.ddpfPixelFormat.lRGBBitCount, _ 0, DDSDM_DEFAULT Me.RefreshErrHandler: Select Case Err.Number Case 0 No Errors Case Else Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _ Err.HelpContext Call Cleanup End SelectEnd Function在Command2的Click事件中加入以下代码:Dim i For i = 0 To Form1.Controls.Count - 1 Form1.Controls(i).Visible = False Next i SetNewDisplayMode再次运行程序,点击列表中的任意一个显示模式,然后点击设置显示模式按钮,可以看到屏幕的显示模式被设置成了你在列表中选择的模式。上面介绍的是如何设置显示模式,下面介绍如何利用DirectSurface对象来进行图形绘制以及如何利用前台绘图平面同后台绘图平面相配合工作。这个程序要实现的目的是:在屏幕上显示一幅背景位图,然后有一个角色在屏幕上移动。为了实现上面的目的,我们需要建立四个绘图平面,一个主平面,就是程序运行时可以看到的平面;一个后台缓冲平面,用于进行图像操作;一个位图平面,用于显示背景位图;一个角色位图平面,用于显示角色位图。在程序运行时首先将背景位图贴到后台缓冲平面,然后将角色位图平面贴到后台缓冲平面,在后台缓冲平面输出一些提示文字,最后将后台缓冲平面的内容贴到主平面上。为完成下面的程序,首先要在你的工程文件的目录下建立一个名字为Demo.bmp的位图文件最为背景和一个名字为 Sprite.bmp 的位图作为角色位图。在Form1中加入一个ListBox控件和两个CommandButton控件。加入Directx7说明库,然后在Form1的代码窗口中添加以下的代码:Option ExplicitDim objDx As New DirectX7Dim objDraw As DirectDraw7Dim objEnumModes As DirectDrawEnumModesDim MainSurf As DirectDrawSurface7Dim BackSurf As DirectDrawSurface7Dim BmpSurf As DirectDrawSurface7Dim SpriteSurf As DirectDrawSurface7Dim ddsd As DDSURFACEDESC2Dim ddsd1 As DDSURFACEDESC2Dim ddsd2 As DDSURFACEDESC2Dim ddsd3 As DDSURFACEDESC2Dim ddsd4 As DDSURFACEDESC2Dim ddsd5 As DDSURFACEDESC2Dim bRun As BooleanDim lastTime As LongDim fps As LongDim lfps As LongDim FrameCount As LongDim Clipper As DirectDrawClipperDim x As DDPIXELFORMATDim sx, sy As IntegerDim Pict() As ByteSub InitSurf() On Error GoTo ErrHandler 设置主绘图平面的属性 ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT ddsd1.lBackBufferCount = 1 ddsd1.ddsCaps.lCaps = DDSCAPS_COMPLEX Or DDSCAPS_FLIP Or DDSCAPS_PRIMARYSURFACE 设置缓冲绘图平面的属性 ddsd2.ddsCaps.lCaps = DDSCAPS_BACKBUFFER 根据ddsd1建立主绘图平面 Set MainSurf = objDraw.CreateSurface(ddsd1) 将BackSurf设置为MainSurf的附加平面 Set BackSurf = MainSurf.GetAttachedSurface(ddsd2.ddsCaps) 设置背景绘图平面的字体和颜色 BackSurf.SetForeColor RGB(255, 255, 255) Form1.Font.Name = 宋体 BackSurf.SetFont Form1.Font 获得缓冲绘图平面的属性并设置到ddsd4中 BackSurf.GetSurfaceDesc ddsd4 设置图形绘图平面的属性 ddsd3.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH ddsd3.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN ddsd3.lWidth = ddsd4.lWidth ddsd3.lHeight = ddsd4.lHeight 建立图形绘图平面 Set BmpSurf = objDraw.CreateSurfaceFromFile(App.Path + demo.bmp, ddsd3) 设定角色位图平面的属性 ddsd5.lFlags = DDSD_CAPS ddsd5.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN 建立角色位图平面 Set SpriteSurf = objDraw.CreateSurfaceFromFile(App.Path + sprite.bmp, ddsd5) Dim key As DDCOLORKEY 设定透明色(在这里设定为0,黑色) key.low = 0 key.high = 0 SpriteSurf.SetColorKey DDCKEY_SRCBLT, key sx = 20: sy = 20 lastTime = objDx.TickCount While True DoEvents Blt WendErrHandler: Select Case Err.Number Case 0 No Errors Case Else 错误退出 Call Cleanup End SelectEnd SubSub Blt() Dim mrectScreen As RECT Dim sTimePass As Single Dim sFramePerS As Single 以黑色清除并填充后台绘图平面 BackSurf.BltColorFill mrectScreen, 0 获得背景位图平面的矩形区域的尺寸 mrectScreen.Right = ddsd2.lWidth mrectScreen.Bottom = ddsd2.lHeight 将图形绘图平面中的内容复制到后台绘图平面上 Call BackSurf.BltFast(0, 0, BmpSurf, mrectScreen, DDBLTFAST_WAIT) 获得前景角色位图平面的矩形区域 mrectScreen.Right = ddsd5.lWidth mrectScreen.Bottom = ddsd5.lHeight 将前景角色位图复制到后台绘图平面上。 Call BackSurf.BltFast(sx, sy, SpriteSurf, mrectScreen, DDBLTFAST_SRCCOLORKEY) sx = sx + 2: sy = sy + 2 If sx 400 Then sx = 20 If sy 400 Then sy = 20 在后台绘图平面上输出文本 BackSurf.DrawText 30, 30, This is my first DirectX program, False BackSurf.DrawText 30, 60, 点击屏幕退出程序, False 获得每秒的播放帧数。 FrameCount = FrameCount + 1 sTimePass = (objDx.TickCount - lastTime) / 1000 If sTimePass 0.5 Then sFramePerS = FrameCount / sTimePass End If BackSurf.DrawText 30, 90, 每秒帧数: + Format$(sFramePerS, #00.0), False 将后台绘图平面上的内容翻转到前台来 MainSurf.Flip Nothing, DDFLIP_WAITEnd SubPrivate Function SetNewDisplayMode() On Error GoTo ErrHandler Dim i As Long i = List1.ListIndex If i = -1 Then MsgBox 请在列表中选择一种显示模式, vbOKOnly, 错误 Exit Function End If 获得用户选择的显示模式 objEnumModes.GetItem (i + 1), ddsd 设置协作模式 objDraw.SetCooperativeLevel Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX _ Or DDSCL_EXCLUSIVE 设置显示模式 objDraw.SetDisplayMode ddsd.lWidth, ddsd.lHeight, ddsd.ddpfPixelFormat.lRGBBitCount, _ 0, DDSDM_DEFAULT Me.RefreshErrHandler: Select Case Err.Number Case 0 No Errors Case Else Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _ Err.HelpContext Call Cleanup End SelectEnd FunctionSub Cleanup() Cleanup函数回复屏幕并且清除DirectX对象 Call objDraw.RestoreDisplayMode Call objDraw.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL) Set objDraw = Nothing Set objDx = Nothing EndEnd SubPrivate Sub Command1_Click() EndEnd SubPrivate Sub Command2_Click() Dim i For i = 0 To Form1.Controls.Count - 1 Form1.Controls(i).Visible = False Next i SetNewDisplayMode InitSurfEnd SubPrivate Sub Form_Click() CleanupEnd SubPrivate Sub Form_Load() Command1.Caption = 结束 Command2.Caption = 设置显示模式 On Error GoTo ErrHandler: Dim ddsd As DDSURFACEDESC2 Dim i As Long, lgCount As Long Set objDx = New DirectX7 建立 DirectDraw 对象 Set objDraw = objDx.DirectDrawCreate() 将DirectDraw对象支持的显示模式设置到DirectDrawEnumModes对象中 Set objEnumModes = objDraw.GetDisplayModesEnum(DDEDM_DEFAULT, ddsd) 将数据设置到ListBox中 lgCount = objEnumModes.GetCount() For i = 1 To lgCount objEnumModes.GetItem i, ddsd List1.AddItem CStr(ddsd.lWidth) & x & CStr(ddsd.lHeight) & x _ & CStr(ddsd.ddpfPixelFormat.lRGBBitCount) Next iErrHandler: Select Case Err.Number Case 0 没有错误 Case Else Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _ Err.HelpContext Call Cleanup End SelectEnd Sub现在程序全部完成了,运行程序,点击列表中的任意显示模式,然后点击设置显示模式按钮,可以看到位图被显示在屏幕上并且在屏幕上显示出程序中的文本。上面的程序比较简单,但是包含了基本的DirectDraw的应用,下面来分析一下:首先通过DirectX7的DirectDrawCreate方法建立一个DirectDraw对象,然后通过GetDisplayModesEnum方法获得DirectDraw对象支持的显示模式,当选择某一种显示模式之后,调用DirectDraw对象的SetDisplayMode方法设置所选择的显示模式。接下来是设置绘图平面,如果对于游戏编程有一些了解的朋友都会知道,为了不使在游戏的图像切换时发生闪烁,我们一般需要设置一个后台绘图平面,对所有的画面首先在后台缓冲平面上做所需要的处理,然后再将它翻转到前台来。从上面的程序可以看到,在程序中一共设置了三个不同的绘图平面:MainSurf、BackSurf、BmpSurf、SpriteSurf。MainSurf是主绘图平面,是程序运行时可以看到的部分;而BackSurf是后台绘图平面;BmpSurf是背景位图平面;SpriteSurf是角色位图平面。我们使用MainSurf的GetAttachedSurface方法将BackSurf设置为MainSurf的附加平面,所有的图形操作首先在在BackSurf上进行,然后在翻转到主平面上来。BmpSurf在程序中利用DirectDraw的CreateSurfaceFromFile函数被设置为一个包含位图的绘图平面。SpriteSurf也做同样的设定,但是为了使只有角色显示出来而无关的部分不显示,我们需要设置SpriteSurf的ColorKey,在上面设置为0黑色,即在粘贴图像时Sprite.bmp 中的黑色部分不会显示出来。然后建立一个无限循环,在每个循环内首先将BmpSurf上的位图转贴到BackSurf上,然后在BackSurf上输出文字,等在BackSurf上的操作全部完成之后,再利用MainSurf的Flip方法将后台绘图平面的内容翻转到前台平面上来。读者需要注意的是这四个绘图平面的不同属性(从ddsd1到ddsd5)。二、 Direct3DDirect3D类对象可以说是DirectX下最重要的同时也是最复杂的对象集合。基本说来,Direct3D可以分为立即模式( Immediate Mode)和保留模式(Retained Mode)。其中保留模式是一种高级3D API编程接口,它是为需要快速开发Direct 3D应用的程序员所准备的。而立即模式是一种低级3D API编程接口,它为需要开发高性能游戏或者多媒体应用的程序员提供了在较低级别上同图形加速硬件打交道的与设备无关的接口。Direct3D的保留模式是建立在立即模式基础之上的,如下图所示:由上面的图可以看到。Direct3D的立即模式同图形加速硬件之间的结合比较紧密,性能比较高,适合于开发三维游戏。而Direct3D的保留模式具有层次性,可移植性比较的好,可以用于开发商业的三维应用程序(例如设备展示等)。要建立一个Direct3D应用,首先要建立Direct3D7对象,利用DirectDraw7对象的GetDirect3D方法可以获得一个Direct3D7对象。利用Direct3D7对象可以建立Direct3D对象以及设置三维环境。利用Direct3D7对象的CreateDevice方法可以建立一个Direct3DDevive7对象,你可以将一个Direct3DDevice7对象想象为一个电影场景,你可以向场景中布置演员(3D对象)、给每个演员安排服装(纹理设置)、设置灯光(光照效果)、设置摄影机(设置视角)。下面通过一个具体的程序来说明Direct3D立即模式的基本原理首先建立一个新的工程并保存,为了给三维对象加上纹理,我们需要在工程目录下建立三个位图文件,文件名分别是t1.bmp、t2.bmp、t3.bmp,位图的尺寸要设置为128*128或者256*256像素,将DirectX7 说明库加入到工程文件中。然后在Form1中加入以下代码:Option ExplicitConst pi As Single = 3.141592Const NUM_CUBE_VERTICES As Integer = 4 * 6Dim g_vCube(NUM_CUBE_VERTICES) As D3DVERTEX定义三个材质表面Dim TextureSurface1 As DirectDrawSurface7Dim TextureSurface2 As DirectDrawSurface7Dim TextureSurface3 As DirectDrawSurface7Dim g_dx As New DirectX7Dim g_dd As DirectDraw7Dim g_ddsd As DDSURFACEDESC2Dim MainBuffer As DirectDrawSurface7Dim BackBuffer As DirectDrawSurface7Dim Direct3DDevice As Direct3DDevice7Dim g_rcDest As RECT, g_rcSrc As RECTDim ViewPortRect(0) As D3DRECTDim bIsRunning As BooleanDim bRoAn As BooleanDim CNT As SingleDim iViewSize As IntegerPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 根据不同的击键值来决定角度的变化 Select Case KeyCode Case vbKeyUp CNT = CNT + 6 bRoAn = True Case vbKeyDown CNT = CNT - 6 bRoAn = True Case vbKeyLeft CNT = CNT + 6 bRoAn = False Case vbKeyRight CNT = CNT - 6 bRoAn = False Case vbKeySubtract If iViewSize 4 Then iViewSize = iViewSize - 1 End If End SelectEnd SubPrivate Sub Form_Load() Dim j As Long InitDDraw InitD3D InitDeviceObjects Me.Show bIsRunning = True Do While bIsRunning = True RenderScene FrameMove (CNT / 360), bRoAn g_dx.GetWindowRect Me.hWnd, g_rcDest 将后台绘图平面的内容复制到前台 j = MainBuffer.Blt(g_rcDest, BackBuffer, g_rcSrc, DDBLT_WAIT) If j DD_OK Then MsgBox 无法将后台绘图平面的内容拷贝到前台,错误代码: & Hex(j) End End If DoEvents LoopEnd SubPrivate Sub FrameMove(stepVal As Single, bType As Boolean) Dim matView As D3DMATRIX Dim matTemp As D3DMATRIX 建立线形矩阵 g_dx.IdentityMatrix matView matView.rc11 = Cos(0.5) matView.rc12 = Sin(0.5) matView.rc21 = Sin(-0.5) matView.rc22 = Cos(0.5) matView.rc33 = 1 matView.rc43 = iviewsize 你可以尝试将下面5句注释掉而使用上面5句进行视矩阵变换,看有什么效果 matView.rc11 = 1 matView.rc22 = Cos(-0.5) matView.rc23 = Sin(-0.5) matView.rc32 = -Sin(-0.5) matView.rc33 = Cos(-0.5) matView.rc43 = iViewSize 对视矩阵进行角度变换 Direct3DDevice.SetTransform D3DTRANSFORMSTATE_VIEW, matView Dim matWorld As D3DMATRIX g_dx.IdentityMatrix matWorld If bType Then g_dx.RotateXMatrix matWorld, stepVal Else g_dx.RotateYMatrix matWorld, stepVal End If Direct3DDevice.SetTransform D3DTRANSFORMSTATE_WORLD, matWorldEnd SubRenderScene函数执行场景重绘和渲染Private Sub RenderScene() Dim i As Integer 将整个视界背景设置为蓝色,并清除Z缓冲 Direct3DDevice.Clear 1, ViewPortRect(), D3DCLEAR_TARGET, &HFF, 1, 0 开始绘制场景 Direct3DDevice.BeginScene 将TextureSurface1设置为Direct3DDevice的纹理平面 Direct3DDevice.SetTexture 0, TextureSurface1 使用TextureSurface1作为纹理绘制g_vCube(0)到g_vCube(3)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(0), _ 4, D3DDP_DEFAULT) 使用TextureSurface1作为纹理绘制g_vCube(4)到g_vCube(7)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(4), _ 4, D3DDP_DEFAULT) 将TextureSurface2设置为Direct3DDevice的纹理平面 Direct3DDevice.SetTexture 0, TextureSurface2 使用TextureSurface2作为纹理绘制g_vCube(8)到g_vCube(11)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(8), _ 4, D3DDP_DEFAULT) 使用TextureSurface2作为纹理绘制g_vCube(12)到g_vCube(15)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(12), _ 4, D3DDP_DEFAULT) 将TextureSurface3设置为Direct3DDevice的纹理平面 Direct3DDevice.SetTexture 0, TextureSurface3 使用TextureSurface3作为纹理绘制g_vCube(16)到g_vCube(19)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(16), _ 4, D3DDP_DEFAULT) 使用TextureSurface3作为纹理绘制g_vCube(20)到g_vCube(23)顶点之间的平面, Call Direct3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, g_vCube(20), _ 4, D3DDP_DEFAULT) 结束绘制场景 Direct3DDevice.EndSceneEnd SubPrivate Sub Form_Unload(Cancel As Integer) bIsRunning = FalseEnd SubInitDDraw函数初始化DirectDraw对象,包括建立主绘图平面以及后台绘图平面Private Sub InitDDr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论