




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用用 VB 编写编写 DirectX7 0 游戏游戏 减小字体 增大字体 作者 佚名 来源 不详 发布时间 2007 12 20 14 38 02 DirectX7 0 终于出现了 同前面 DirectX6 相同 版本 7 也带了一个庞大 129M 的 SDK 开发库 同 DirectX6 SDK 库相比 DirectX7 的 SDK 库提供了以下新的功能 对于 Visual Basic 的支持 用户可以使用类库在 Visual Basic 环境下开发基于 DirectX 的 程序 提供更多 DirectX3D 立即模式 Immediate Mode 下的 API 函数 以支持 DirectX7 中 新的 3D 特效 包括立体环境映射 顶点混合等 DirectMusic 支持 DownLoadable Sound Level 2 标准 DirectInput 支持 8 按键的游戏杆设备 同时支持 Microsoft 的力反馈摇杆 SDK 库提供 了读取力反馈效果文件的方法 同时提供了 Force Editor 程序来建立效果 对于 VB 爱好者来说 新的 SDK 库终于提供了完整的对 VB 的支持 现在终于可以使用 Visual Basic 来编写 DirectX 的程序了 一 DirectX SDK 库的安装 微软提供的 SDK 库是一个 重 达 129M 的 dx7sdk exe 自解压缩文件 你可以上网下载或者 从配套光盘上获得这个文件 双击文件就会弹出 Winzip 自解压缩对话框 在弹出的 WinZip Self Extract DK7SDK EXE 窗口中输入解压缩文件的路径 然后点击 Unzip 按钮 解压缩 SDK 文件 要注意的是 dx7sdk exe 解压缩之后的体积有 220M 硬盘比较紧张的读者在解压缩之前首 先看看你的硬盘的容量是否足够 解压缩完毕之后 进入解压缩的目录中 双击 Setup exe 文件就可以安装 DirectX7 0 SDK 文件了 安装是采用标准的 InstallShield 界面 玩 Windows 的读者应该对这种安装界面驾 轻就熟 只要跟着安装提示一步一步地走就可以了 安装完毕之后 安装程序会在开始菜 单中添加一个 Microsoft DirectX 7 SDK 的菜单 其中包括 DirectX 7 设置工具 VB 范例和 SDK Help 等菜单项 现在开始进入 VB 开始我们的 DirectX 的 VB 编程 在这里我们使用的是 VB6 企业版 英文 Windows98 中文版 打开 VB 点击菜单中的 Project References 项 在 Object Library 列表中会有一项 DirectX 7 0 For Visual Basic Type Library 列表项 这个就是 DirectX7 0 VB 类库 选中该项 再选 ok 按钮 就可以将库加入工程文件中 二 DirectX 编程初步 1 DirectX7 对象 DirectX7 对象是 DirectX VB 对象中其他所有对象的服务和起始对象 这个对象包含了建立 诸如 DirectDraw Direct3D DirectSound DirectInput 等对象的方法 同时该对象还包 含了一系列的三维控件顶点和距阵的操作函数以及一些 DirectX 系统函数 在 VB 中可以 通过 Dim N ew 来直接定义和初始化一个 DirectX7 对象 例如 Dim DirectX As New DirectX7 当建立成功一个 DirectX7 对象之后 就可以使用该对象的 DirectDrawCreate Direct3DRMCreate 等方法建立 DirectDraw Direct3D 对象了 DirectX7 对象范例 1 获得系统中的 DirectDraw 和 DirectSound 驱动 建立一个新的工程文件 点击菜单中的 Project References 项 在 Object Library 列表中 选中 DirectX 7 0 For Visual Basic Type Library 项后按确定按钮 以下的程序都需要这个步 骤 后面将不再做说明 然后在 Form1 中加入一个 ListBox 控件和四个 CommandButton 控件 在 Form1 的代码窗口中加入以下代码 Option Explicit Dim DirectX As New DirectX7 Dim DDEnum As DirectDrawEnum Dim DDSound As DirectSoundEnum Private Sub Command1 Click Dim Count i As Integer Set DDEnum DirectX GetDDEnum Count DDEnum GetCount List1 Clear For i 1 To Count List1 AddItem DDEnum GetDescription i Next i Set DDEnum Nothing End Sub Private Sub Command2 Click Dim Count i As Integer Set DDEnum DirectX GetDDEnum Count DDEnu m GetCount List1 Clear For i 1 To Count List1 AddItem DDEnum GetName i Next i Set DDEnum Nothing End Sub Private Sub Command3 Click Dim Count i As Integer Set DDSound DirectX GetDSEnum Count DDSound GetCount List1 Clear For i 1 To Count List1 AddItem DDSound GetDescription i Next i End Sub Private Sub Command4 Click Dim Count i As Integer Set DDSound DirectX GetDSEnum Count DDSound GetCount List1 Clear For i 1 To Count List1 AddItem DDSound GetName i Next i End Sub Private Sub Form Load Command1 Caption DirectDraw 驱动描述 Command2 Caption DirectDraw 驱动名称 Command3 Caption DirectSound 驱动描述 Command4 Caption DirectSound 驱动名称 End Sub Private Sub Form Unload Cancel As Integer Set DirectX Nothing End Sub 运行程序 分别点击不同的按钮 在列表框中就会出现相应的设备驱动名和描述 2 DirectDraw7 对象 DirectDraw 是一个与 Windows 图形系统接口 GDI 相兼容的直接操作显示设备的软件接口 DirectDraw 提供与硬件无关性 的同时允许直接操作显存 程序只要使用一些基本的标准硬件约定 如 RGB 及 YUV 色 彩格式及解析度 你无须调用特殊的过程来使用显存块移动 Blitter 及调色板 使用 DirectDraw 你可简单操作显存 完全使用各种硬件特性而不必理会各种不同硬件之间的 差异 2 1 建立 DirectDraw 对象 DirectDraw7 对象是 DirectX7 中的 DirectDraw 对象 你需要首先建立一个 DirectX7 对象 然后使用该对象的 DirectDrawCreate 方法来建立 DirectDraw7 对象 例如 Dim DX As New DirectX7 Dim DDraw As DirectDraw7 Set DDraw DX DirectDrawCreate 2 2 建立协作层 当建立了一个 DirectDraw 对象之后 首先要设定 DirectDraw 的协作层 实现的方法是调用 DirectDraw 对象的 SetCooperativeLevel 函数 该函数的定义是 object SetCooperativeLevel hdl As Long flags As CONST DDSCLFLAGS 其中参数 hdl 指定程序的窗口句柄 参数 flag 决定程序运行的方式 函数调用 DDraw SetCooperativeLevel Me hWnd DDSCL NORMAL 将使程序运行于普通的协作层即窗口模式之下 在这种协作层你无法改变主平 面调色板或进行页交换 因为程序可以使用多窗口 而函数调用 DDraw SetCooperativeLevel MainForm hWnd DDSCL EXCLUSIVE Or DDSCL FULLSCREEN 将使程序运行于全屏幕模式之下 在全屏幕协作模式之下你可以完全使用硬件的一切 在 这个模式之下 你可以设置使用定义及动态调色板 改变显示分辨率及进行页交换 2 3 设置显示模式 设置显示模式是使用 SetDispalyMode 函数实现的 函数的定义如下 object SetDisplayMode w As Long h As Long bpp As Long ref As Long mode As CONST DDSDMFLAGS 其中参数 w h 分别指定屏幕的宽度和高度 bpp 指定屏幕显示的颜色位数 参数 ref 指定 屏幕的刷新频率 设置为 0 使用显示驱动的缺省刷新频率 mode 指定附加的参数 要获得 系统支持的显示模式 可以使用 DirectDraw 对象的 GetDisplayModesEnum 函数来遍历所有 支持的显示模式 2 4 建立平面对象 一个平面或者说 DirectDrawSurface 对象是 DirectDraw 中图形显示和绘制对象 用户可以在 DirectDrawSurface 上贴位图 绘制图形 还可以直接操作 DirectDrawSurface 对象使用显存 里的内容 利用 DirectDraw 对象的 CreateSurface 方法可以建立一个 DirectDrawSurface7 对 象 例如 Pu blic DDSFrontDesc As DDSURFACEDESC2 With DDSFrontDesc lFlags DDSD CAPS ddsCaps lCaps DDSCAPS PRIMARYSURFACE End With Set DDSFront DDraw CreateSurface DDSFrontDesc 也可以利用 DirectDraw 对象的 CreateSurfaceFromFile 函数或者 CreateSurfaceFromResource 函数建立一个 DirectDrawSurface7 对象 同时将图像文件或者资源文件中的图像装入建立 的 DirectDrawSurface 中 如果上面的函数调用成功 函数将返回一个 DirectDrawSurface 对 象 如果在设定 DirectDraw 对象的协作层时将其设置为全屏幕模式的话 为了改善图像性 能 可以设立一个主平面和若干个屏下缓冲平面 首先在屏下平面中生成图像 然后将图 像翻转到主平面上 这样可以有效地避免图像闪烁 下面通过一个具体的范例来对 DirectDraw 进行说明 这个范例建立一个全屏幕的 DirectDraw 对象 通过操作主显示平面的显示内存在屏幕上显示火焰字的特效 然后按 Enter 键可以将 DirectDraw 平面中的图形保存起来 程序的具体实现如下 建立一个新的工程文件 点击菜单中的 Project Reference 选项 打开 Object Library 列表 窗口 将 DirectX 7 0 For Visual Basic Type Library 加入工程文件 将 Form1 的 Na me 属性 改变为 MainForm 在 MainForm 中加入一个 PictureBox 控件 将其的 Visible 属性设置为 False 然后在 MainForm 的代码窗口中加入以下代码 Private Sub Form KeyPress KeyAscii As Integer Dim sRect As RECT Dim hdcSrc As Long If KeyAscii 27 Then ExitLoop True End ElseIf KeyAscii VBKeyReturn Then DDSFront BltToDC Picture1 hDC sRect sRect With Picture1 获得与主显示平面兼容的图形设备句柄 hdcSrc DDSFront GetDC 保存图像 Set Picture SaveTohBmp hdcSrc 0 0 640 480 释放图形句柄 DDSFront ReleaseDC hdcSrc SavePicture Picture1 c a bmp End With End If End Sub Public Sub Form Paint BlitRect Right DDSBackDesc lWidth BlitRect Bottom DDSBackDesc lHeight DDSFront Blt BlitRect DDSBack BlitRect DDBLT WAIT End Sub 在工程文件中加入一个 Module 文件 这个文件中 DirectDraw 操作做出了定义 在这个 Module 中加入以下代码 Option Explicit Public DX As New DirectX7 Public DDraw As DirectDraw7 Public DDSFront As DirectDrawSurface 7 Public DDSFrontDesc As DDSURFACEDESC2 Public DDSBack As DirectDrawSurface7 Public DDSBackDesc As DDSURFACEDESC2 Public Clipper As DirectDrawClipper Dim Pict As Byte Dim AlphaRect As RECT Dim X As Long Y As Long Dim Temp As Long Dim Index As Long Dim Index2 As Long Dim Pos As Long Dim PosPlus1 As Long Dim PosPlus2 As Long Dim PosPlus3 As Long Public Pal 255 As PALETTEENTRY Public Palette As DirectDrawPalette Public BlitRect As RECT Public FullSize As Boolean Public ExitLoop As Boolean Dim Accum As Long Dim Msg 9 As String Dim Counter As Long Dim MsgIndex As Long Dim bDrawText As Boolean Dim lastTime As Long Dim XPos As Long YPos As Long Dim wait As Long Dim Angle As Single Dim Flag As Boolean Dim Count As Long Dim CurModeActiveStatus As Boolean Dim bRestore As Boolean Dim Mode As Boolean Private Sub Main InitializeDX 初始化 Picture1 以获得 DirectDraw 界面图像 With MainForm Picture1 Width 640 Screen TwipsPerPixelX Height 480 Screen TwipsPerPixelY End With DDSBack SetForeColor RGB 255 255 255 MainForm Font Name 宋体 DDSBack SetFont MainForm Font Msg 0 一个显示火焰字的演示 Msg 1 演示 Msg 2 利用 VB 阵列 Msg 3 对显示内存 Msg 4 进行直接存取 Msg 5 Esc 键退出 设置 8 位的调色板 For Index 0 To 84 Pal Index 1 red Index 3 3 Pal Index 1 green 0 Pal Index 1 blue 0 Pal Index 86 red 255 Pal Index 86 green Index 3 3 Pal Index 86 blue 0 Pal Index 171 red 255 Pal Index 171 green 255 Pal Index 171 blue Index 3 3 Next Set Palette DDraw CreatePalette DDPCAPS 8BIT Or DDPCAPS ALLOW256 Pal DDSFront SetPalette Palette AlphaRect Right DDSBackDesc lWidth 1 AlphaRect Bottom DDSBackDesc lHeight 1 DDSBack Lock AlphaRect DDSBackDesc DDLOCK WAIT 0 DDSBack GetLockedArray Pict For X 0 To 639 For Y 0 To 479 Pict X Y 0 Next Next Corresponding unlock DDSBack Unlock AlphaRect While Not ExitLoop Mode ExModeActive bRestore False Do Until ExModeActive DoEvents bRestore True Loop DoEvents If bRestore Then bRestore False DDraw RestoreAllSurfaces End If DDSBack Lock AlphaRect DDSBackDesc DDLOCK WAIT 0 DDSBack GetLockedArray Pict For Y 0 To 479 Pict 0 Y 0 Pict 639 Y 0 Next For X 0 To 639 Pict X 477 Rnd 220 35 Pict X 478 Rnd 220 35 Pict X 479 Rnd 220 35 Next Accum 0 For X 1 To 638 For Y 0 To 477 Accum Accum Pict X Y 1 Pict X Y 2 Pict X 1 Y 1 Pict X 1 Y 1 5 If Accum 255 Then Accum 255 End If Pict X Y Accum Next Next For X 0 To 639 Pict X 0 0 Pict X 1 0 Next X Rnd 639 For Y 50 To 439 Next Unlock DDSBack Unlock AlphaRect If DX TickCount lastTime wait Then If Counter 0 Then bDrawText True Counter 1 XPos Rnd 200 YPos 300 Rnd 140 wait 400 ElseIf Counter 1 Then MsgIndex MsgIndex 1 If MsgIndex 5 Then MsgIndex 0 bDrawText False Counter 0 wait 2000 End If lastTime DX TickCount End If Draw Text to the backbuffer If bDrawText Then On Error Resume Next DDSBack DrawText XPos YPos Msg MsgIndex False On Error GoTo 0 End If MainForm Form Paint Wend TerminateDX End End Sub Function ExModeActive As Boolean Dim TestCoopRes As Long TestCoopRes DDraw TestCooperativeLevel Select Case TestCoopRes Case DDERR NOEXCLUSIVEMODE ExModeActive False Case DD OK ExModeActive True End Select End Function Public Sub InitializeDX MainForm Left 0 MainForm Top 0 MainForm Height 640 Screen TwipsPerPixelY MainForm Width 480 Scre en TwipsPerPixelX MainForm Show 建立 DirectDraw 对象 Set DDraw DX DirectDrawCreate 设定 DirectDraw 对象的协作层 DDraw SetCooperativeLevel MainForm hWnd DDSCL EXCLUSIVE Or DDSCL FULLSCREEN DDSCL NORMAL 设定显示模式位 640 480 8 位颜色 DDraw SetDisplayMode 640 480 8 0 DDSDM DEFAULT 设定 DDSFrontDesc 为主平面 With DDSFrontDesc lFlags DDSD CAPS ddsCaps lCaps DDSCAPS PRIMARYSURFACE Or DDSCAPS SYSTEMMEMORY End With 设定 DDSBackDesc 为后台缓冲平面 With DDSBackDesc ddsCaps lCaps DDSCAPS SYSTEMMEMORY lFlags DDSD CAPS Or DDSD WIDTH Or DDSD HEIGHT lWidth 640 lHeight 480 End With 建立平面 Set DDSFront DDraw CreateSurface DDSFrontDesc Set DDSBack DDraw CreateSurface DDSBackDesc Set Clipper DDraw CreateClipper 0 Clipper SetHWnd MainForm hWnd DDSFront SetClipper Clipper DDSBack SetClipper Clipper DoEvents Exit Sub ERRoUT If Not DDraw Is Nothing Then DDraw RestoreDisplayMode DDraw SetCooperativeLevel MainForm hWnd DDSCL NORMAL DoEvents End If MsgBox 无法对 DirectDraw 进行初始化 Chr 13 也许你的显示卡不支持 640 480 8 显示模式 End End Sub Public Sub TerminateDX 子程序 TerminateDX 回复原来的显示模式并且释放所有的 DirectDraw 有关对象 DDraw RestoreDisplayMode DDraw SetCooperativeLevel MainForm hWnd DDSCL NORMAL DoEvents Set Clipper Nothing Set DDSBack Nothing Set DDSFront Nothing Set DDraw Nothing Set DX Nothing End Sub 在工程文件中再加入一个 Module 这个 Module 主要定义与图像保存相关的操作 在建立 的 Module 中加入以下代码 Option Explicit Option Base 0 Private Type PALETTEENTRY peRed As Byte peGreen As Byte peBlue As Byte peFlags As Byte End Type Private Type LOGPALETTE palVersion As Integer palNumEntries As Integer palPalEntry 255 As PALETTEENTRY Enough for 256 colors End Type Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4 7 As Byte End Type Private Const RASTERCAPS As Long 38 Private Const RC PALETTE As Long H100 Private Const SIZEPALETTE As Long 104 Private Declare Function CreateCompatibleDC Lib GDI32 ByVal hDC As Long As Long Private Declare Function CreateCompatibleBitmap Lib GDI32 ByVal hDC As Long ByVal nWidth As Long ByVal nHeight As Long As Long Private Declare Function GetDeviceCaps Lib GDI32 ByVal hDC As Long ByVal iCapabilitiy As Long As Long Private Declare Function GetSystemPaletteEntries Lib GDI32 ByVal hDC As Long ByVal wStartIndex As Long ByVal wNumEntries As Long lpPaletteEntries As PALETTEENTRY As Long Private Declare Function CreatePalette Lib GDI32 lpLogPalette As LOGPALETTE As Long Private Declare Function SelectObject Lib GDI32 ByVal hDC As Long ByVal hObject As Long As Long Private Declare Function BitBlt Lib GDI32 ByVa l hDCDest As Long ByVal XDest As Long ByVal YDest As Long ByVal nWidth As Long ByVal nHeight As Long ByVal hdcSrc As Long ByVal XSrc As Long ByVal YSrc As Long ByVal dwRop As Long As Long Private Declare Function DeleteDC Lib GDI32 ByVal hDC As Long As Long Private Declare Function GetForegroundWindow Lib USER32 As Long Private Declare Function SelectPalette Lib GDI32 ByVal hDC As Long ByVal hPalette As Long ByVal bForceBackground As Long As Long Private Declare Function RealizePalette Lib GDI32 ByVal hDC As Long As Long Private Declare Function GetWindowDC Lib USER32 ByVal hWnd As Long As Long Private Declare Function GetDC Lib USER32 ByVal hWnd As Long As Long Private Declare Function GetWindowRect Lib USER32 ByVal hWnd As Long lpRect As RECT As Long Private Declare Function ReleaseDC Lib USER32 ByVal hWnd As Long ByVal hDC As Long As Long Private Declare Function GetDesktopWindow Lib USER32 As Long Private Type PicBmp Size As Long Type As Long hBmp As Long hPal As Long Reserved As Long End Type Private Declare Function OleCreatePictureIndirect Lib olepro32 dll PicDesc As PicBmp RefIID As GUID ByVal fPictureOwnsHandle As Long IPic As IPicture As Long Public Function SaveTohBmp ByVal hdcSrc As Long ByVal LeftSrc As Long ByVal TopSrc As Long ByVal WidthSrc As Long ByVal HeightSrc As Long As Picture Dim hDCMemory As Long Dim hBmp As Long Dim hBmpPrev As Long Dim r As Long Dim hPal As Long Dim hPalPrev As Long Dim RasterCapsScrn As Long Dim HasPaletteScrn As Long Dim PaletteSizeScrn As Long Dim LogPal As LOOGPALETTE 建立一个内存图形设备句柄 hDCMemory CreateCompatibleDC hdcSrc 建立一个 bitmap 并保存到 hDCMemory 中 hBmp CreateCompatibleBitmap hdcSrc WidthSrc HeightSrc hBmpPrev SelectObject hDCMemory hBmp Get screen properties Ra sterCapsScrn GetDeviceCaps hdcSrc RASTE 图 CAPS rRaste capab li es HasPaletteScrn RasterCapsScrn And RC PALtTTEic1 Palette support PaletteSizeScrn GetDeviceCaps hdcSrc SIZEPALETTE Size of palette If HasPaletteScrn And PaletteSizeScrn 256 Then 建立系统调色板的拷贝 LogPal palVersion H300 LogPal palNumEntries 256 r GetSystemPaletteEntries hdcSrc 0 256 LogPal palPalEntry 0 hPal CreatePalette L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科学毛笔 考试题及答案
- 绢纺精炼操作工成本控制考核试卷及答案
- 模铸工知识考核试卷及答案
- 掘进作业考试题及答案
- 铸管制芯工主管竞选考核试卷及答案
- 课件无法保存显示错误
- 信号设备组调工前沿技术考核试卷及答案
- 链条装配工专业技能考核试卷及答案
- 铝电解工异常处理考核试卷及答案
- 氯化炉工测试考核试卷及答案
- 《医疗机构工作人员廉洁从业九项准则》解读
- 5.2做自强不息的中国人(教学设计)2024-2025学年七年级道德与法治下册(统编版2024)
- 2025-2030中国枸杞种植及深加工市场销售格局及未来营销创新研究报告
- 环氧地坪维修施工方案
- 家庭医生签约服务培训课件
- 通信系统建模与仿真(基于MWORKS) 课件 第2章 MWORKS 科学计算与系统建模仿真基础
- 大数据治理与服务平台建设及数据服务运营实施技术方案
- 某铁路站前工程安全生产管理办法
- 无人机集群控制技术-深度研究
- 部编版小学道德与法治六年级上册配套表格式教案(全册)
- 商务星球版八年级地理上册4.1《因地制宜发展农业》听课评课记录
评论
0/150
提交评论