分享
 
 
 

在CB中进行DirectX编程(1)

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

C++ Builder是一个可视化的C++编程环境,它为编程人员提供了一种方便高效、简便的C++语言开发工具,因此已为广大C++程序员所青睐,DirectX开发工具包是微软公司提供的一套Windows9X下开发高性能图形、声音、输入输出和网络游戏的接口,其高效的直接硬件访问、程序与硬件设备之间的相对独立等特性,几乎使得DirectX成为唯一可以在Windows操作系统下开发游戏程序的基本工具软件。

虽然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”的显示方式,屏幕就会马上切换为指定的显示方式。

2.2.2 dx1编程实现

启动C++ Builder后在窗口Form1中设计如图2.1的操作界面,各对象相关属性设置如表2.1:

控件对象类型 控件对象名称 相关属性 属性值

TForm Form1 Caption DirectX 练习程序1

TLabel Label1 Caption 运行状态:

TLabel Label2 Caption 设备的枚举

Tlabel Label3 Caption 显示模式DDraw2

TEdit Edit1 Text (空)

ReadOnly true

TGroupBox GroupBox1 Caption 状态

TCombBox ComboBox1 Text (空)

TCombBox ComboBox2 Text (空)

TGroupBox GroupBox2 Caption 协作级别

TCheckBox CheckBox1 Caption DDSCL_ALLOWMODEX

TCheckBox &

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有