分类: C/C++
2008-05-31 14:06:27
C++ Builder是一个可视化的C++编程环境,它为编程人员提供了一种方便高效、简便的C++语言开发工具,因此已为广大C++程序员所青睐,DirectX开发工具包是微软公司提供的一套9X下开发高性能图形、声音、输入输出和网络游戏的接口,其高效的直接硬件访问、程序与硬件设备之间的相对独立等特性,几乎使得DirectX成为唯一可以在操作系统下开发游戏程序的基本工具软件。
虽然C++ Builder中直接包含了一套DirectX3的开发包,也提供了一些例程,但是这些例程没有系统化的说明,同时也不适合DirectX5以上的程序开发。另一方面,几乎所有关于DirectX开发的书籍和文献均使用Visual C++语言描述,所以作者将自己在C++ Builder中的一些开发经验介绍给读者。
本文适合具备C++ Builder面向对象编程经验的读者,实例开发环境为中文Windows98、C++ Builder4、DirectX6或以上的开发工具包。
一.DirectX简介
1_1.DirectX的特性
1_2.DirectX是一种Windows环境下标准的高性能游戏、多媒体开发工具包,使用DirectX开发的程序能够与操作系统默契地配合成为“真正”的桌面应用程序;可以利用硬件厂商提供的驱动程序接口,充分最佳的设备性能;通过直接底层硬件操作,实现最快速、短延时、设备无关的底层接口。
1_3.DirectX采用了组件对象模型(COM)标准,因此对于不同对象的版本可以有不同的接口,这使得用DirectX开发的程序在未来将得到完全兼容和支持的保证。
1_4.DirectX的结构
DirectX需要以设备无关的方法提供设备相关的性能,所以DirectX的结构是由两个驱动程序构成:硬件抽象层(HAL)和硬件模拟层(HEL),当Direct对象创建时,会同时建立一张“兼容表”,其中记录了当前硬件系统支持的功能,当DirectX需要实现某个功能时就查询该表,得到硬件对功能的支持信息,如果功能能够得到硬件支持,则向HAL发出求,以得到硬件的支持,否则向HEL发出请求,以模拟方式实现功能。
1_5.DirectX的主要组成
(1)DirectDraw:直接访问图形硬件,管理用于显示的内存(显示内存和系统内存),提供高速图形和页面切换动画;
(2)Direct3D:提供3D硬件接口;
(3)DirectInput:主要支持输入服务,同时支持输出设备;
(4)DirectSound:提供3D声音效果,管理声卡内存;
(5)DirectPlay:提供网络多人游戏的通讯、组织功能;
(6)DirectSetup:自动安装DirectX驱动程序。
本文将按照DirectX的上述组成,分别以实例介绍其在C++ Builder中的实现方法。
二.DirectDraw程序设计
2.1 DirectDraw实现的基础—显示方式的设置
设计图形程序首先遇到的问题是将屏幕设置成一种合适的图形显示方式,然后把图形绘画到屏幕页面上。如果您在DOS下开发图形应用程序,这将是很简单的事,只要调用DOS的中断服务程序即可实现,但是使用用DirectDraw就比较复杂。由于DirectDraw的设计目标是提供设备无关的编程接口和高效、多功能的硬件访问支持,所以DirectDraw需要考虑更多的问题。
DirectDraw在Windows环境下支持两种图形方式:全屏幕独占方式和窗口方式。这里我先以全屏幕独占方式,介绍DirectDraw设置屏幕显示方式步骤,函数具体使用格式和编程方法将在2.2中介绍:
2.1.1 选择硬件设备
计算机系统不一定只有一个DirectDraw硬件抽象设备,例如,一台计算机可能有两台或更多的显示器,那么DirectDraw对象与哪个HAL对应呢?我们可以使用DirectDrawEnumerate函数来枚举系统所有已安装的设备,以供选择,并返回设备的唯一标识GUID。DirectDraw默认主显示设备的GUID为NULL;
2.1.2 创建DirectDraw对象
由于DirectX是使用面向对象的程序设计技术,因此,使用DirectDraw编程就首先要创建DirectDraw对象。使用DirectDrawCreate函数及将第一步获得的设备GUID作为参数可以创建基于所选设备的DirectDraw对象;
2.1.3 获取DirectDraw更高版本的COM接口
如果您不打算使用DirectX5以上版本提供的功能则可以跳过本步骤,否则必须使用新创建DirectDraw对象的QueryIntrface方法来获得IDirectDraw2或更高的COM接口。在2.2例中将介绍如何获得DirectX5以上版本提供的IDirectDraw2接口;
2.1.4 设置协作级别
协作方式可以控制程序与系统其他应用程序之间的交互关系,典型的例子是:设置为全屏独占方式还是窗口普通方式。设置协作级别可以用DirectDraw对象的SetCooperativeLevel方法;
2.1.5 枚举设备支持的各种显示方式,选择并设置合适的显示分辩率、色彩深度和刷新频率等。
使用DirectDraw的EnumDisplayModes方法可以枚举设备支持的所有图形方式供用户选择,在某些已确定图形显示方式的应用程序中可以通过此枚举功能来检查系统设备是否支持指定的图形显示方式。
使用DirectDraw的SetDisplayMode方法可以设置所需要的图形显示方式。
2.2 用DirectDraw设置屏幕图形显示方式的实例
现在我们开始编写第一个示例程序“设置全屏幕独占图形显示方式的程序”dx1,首先我们将在这里讨论C++ Builder中进行DirectX编程的有关问题,然后再详细介绍实现程序每一步骤的相关技术。
2.2.1 dx1程序运行过程介绍
dx1是根据DirectDraw设置屏幕图形方式的过程设计的,运行界面如图2.1所示。在窗口右边有六个功能按钮,它们按照屏幕图形显示方式设置实现的步骤自上而下排列,程序开始运行时,除第一个按钮“显示设备的枚举”是可用的,其它按钮均不可用。由于用户必需按照固定的步骤操作,所以,当一个按钮任务完成后,dx1程序会将下一步任务的
图2.1 dx1 屏幕显示方式设置程序运行界面
按钮设为可用。
按下“显示设备枚举”按钮后,窗口左上方“运行状态”对应的文本框中将显示任务完成情况,若成功则显示“Enumerate devices OK!”,否则显示“Enumerate devices failed!” ,同时在状态组中的设备枚举下拉框中可以看到枚举的设备(一般系统只有一个”主显示设备—Display);确定设备枚举选择为“主显示设备”后,可以进行“创建DirectDraw对象”、“获得COM的IDIRECT2接口”、“设置协作级别”,每个步骤的运行状态都会显示在“运行状态”右边的文本框中;在执行了“DDraw2显示模式的枚举”后,状态组下方“显示模式DDraw2”下拉框中将列出所有显示设备支持的显示方式,选择需要的图形显示方式,再按“设置DDraw2”的显示方式,屏幕就会立刻切换为指定的显示方式。