在CB中进行DirectX编程(1)

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方法可以设置所需要的图形显示方式。

时间: 2024-08-03 18:16:06

在CB中进行DirectX编程(1)的相关文章

在CB中进行DirectX编程(3)

2.3 装入并显示图形文件 为了简明地说明采用DirectDraw图形文件的显示技术,我们以示例程序dx2介绍图面.图形文件装入.图形缩放.图形在图面上显示等的初步概念和实现技术. 2.3.1 DirectDraw显示图形的技术 为了显示图象,DirectDraw必需首先拥有类似画布(canvas)的绘图空间,DirectDraw并不向在DOS下那样简单地将显示缓存作为绘画的对象,而是通过DirectDraw对象创建各种不同种类的"图面"(Suerface),图面上的内容可以被应用程序

在CB中进行DirectX编程(4)

2.3.4.3 程序文件main.cpp #include <vcl.h> #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //---------

在CB中进行DirectX编程(2)

2.2.3 dx1源程序 2.2.3.1 dx1主要文件的组成为:工程文件(dx1.bpr).窗口文件(main.cpp).头文件(main.h). 2.2.3.2 头文件main.h #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp&g

C#中使用DirectX编程

编程   我感觉声音的播放比较简单.我们从播放声音开始.为什么我这么觉得?我也不知道.这里是展示最最最最最简单的DirectX播放声音的例子,我尽量省略了无关的代码.最后的代码只有19行,够简单了吧? 准备工作:1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSound.dll2.一个WAV文件.(这样的文件比较好找,在QQ的目录里就不少啊.这里就不多说了.)名字叫SND.WAV,

DirectX编程:C#中利用Socket实现网络语音通信[初级版本]

 [声明:本篇来源:http://www.cnblogs.com/stg609/archive/2008/11/19/1334544.html 作者:stg609]       现在时下的VOIP软件很多,比较有名的就是Skype,还有其它诸如UUcall. 快门等等.它们提供的功能除了网络上的语音通话外,还可以与固定电话.手机等通话.在本篇中主要介绍利用C#实现语音通信的基本方法.但是目前只实现了网 络上语音传输的基本功能,而且比较粗糙,没有采用什么算法来优化,所以大家千万不要期望过高.我写这

一个用于 DirectX 编程的现代 C++ 库

我写过很多 DirectX 代码,也写过很多关于 DirectX 的文章.我甚至还编写过关于 DirectX 的在线培训课程.它其实并不像某些开发人员所说的那么难以理解.学习曲线一定会有,但一旦您过了这道坎,就不难理解 DirectX 的工作方式及其为何要如此工作的原因了.不过我也承认,DirectX 系列 API 的易用性应该更高些. 几天前,我决定着手修补一下这个缺陷.我熬了一整夜,编写了一个小头文件.随后几晚,我又将代码行扩展到了近 5,000 行.我的目标是提供一些可借助 Direct2

WorldWind系列十:RendableObject中的DirectX渲染分析:ImageLayer为例

学习WW有一段时间了,但是若想开发自己基于WW的插件,必然会遇到RendableObject中的DirectX渲染问题.所有需要渲染绘制的 WW三维插件,最终是通过继承RendableObject并实现自己的Initialize().Update().Render()方法的.想写自己的Render()方法不是简单的事情,你必然要学习DirectX编程,否则,你连看懂示例中的底层Render()方法都很难,谈何开发自己的插件. 为了突破DirectX编程对我学习WW插件的阻挠,我"快餐式"

slimdx-怎样用slimDX中的C#编程画三维的线和管?

问题描述 怎样用slimDX中的C#编程画三维的线和管? 第一次接触slimDX.要求在.net环境下用C#语言编程画出线和管来,不是编写高深的游戏.网上搜索找不到相关的内容,只发现了两个画出三角形和立方体的例子.想问一下有没有画线或者管的语言指令?要注意些什么?求详细指教.如果能提供一个简单例子就更好了. 解决方案 slimDX 网上的例子比较少,如果需要的话,建议你研究DirectX的技术,slimDx就是用.net把DirectX进行了封装,其实还是用的DirectX技术

Lua中的面向对象编程详解_Lua

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码 代码如下: local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 print(tb1.a) 上述代码会输