登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 入门基础 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

DirectX编程技术
发表日期:2007-01-17作者:[转贴] 出处:  


大家对DirectX一定不陌生吧,因为在微软刚刚推出WINDOWS窗口操作系统时,由于显示界面采用统一的GDI,禁止程序员直接操作硬件,这使得在WIN 3.x系统上的游戏程序速度奇慢,根本无法推广。微软为了解决这一问题,曾经又推出过WING图形加速程序,但是由于WING缺乏广大游戏厂商的支持,也没有普及开来。所以我们当时玩的大部分游戏都是运行于DOS环境之下。
直到1995年,伴随着WINDOWS 95的诞生,微软公司正式公布了其新一代的游戏开发系统DirectX。DirectX以其高效的性能,统一的程序接口,使得其一推出便受到了各大游戏厂家的喜爱,并纷纷表示支持它,至此WINDOWS系统下的游戏开发时代才真正开始。
DirectX编程,将涉及到 WIN 95 和 C++ 的一些基本知识,所以在此之前您最好有这方面的基础,如果您不是很熟悉他们的话也不要紧,完全可以随着本文介绍一起学习,可谓一箭双雕。

好了,闲话少说开始进入正题:
(一)DirectX由以下几个部分组成:
1、DirectDraw:通过直接访问显示内存和软硬件加速技术,实现快速直接存取。
2、DirectSound:提供软硬件声音混合和录音再生功能。
3、DirectPlay :提供多人游戏的交互功能,让您轻松实现网上互连。
4、Direct3D:交互式的三维图形技术。
5、DirectInput:使你的程序能够控制输入设备如鼠标,键盘,和游戏杆等。
6、DirectSetup:完成DirectX驱动程序的安装。
7、AutoPlay:只要您把光碟一放入光驱它便会自动运行。
 最后补充一句,我们讲到和用到的都是DirectX 5的东西,所以需要一套DirectX 5 SDK,你可以在时下一些光盘中找找,它是免费的。

(二)正式编程之前的准备工作
要让VC++ 5能正确的编译、链接你的程序,你必须先在Microsoft Developer Studio中进行如下设置,以使得编译器能够找到需要的链接库和包含文件。
首先,打开一个新的project workspace,在File菜单中,选择New建立一个新的Win32 Application取名为‘MyDirectX1’,这时在workspace窗口中就会出现了一个新的文件夹。工程创建好后,在Project菜单中选择Add to Project/Files向新的工程中加入程序(这步在后面介绍)。
然后,设置编译时所需包含文件的路径。在Tools菜单中,选择Options,弹出Options对话框,选中Directories ,在Show Directories For列表框中选择Include files,双击列表框底部的空白行,输入C:\DX5SDK\SDK\INC 和 C:\DX5SDK\SDK\SAMPLES\MISC;接着再在Show Directories For列表框选择Library files,双击其底部的空白行,输入C:\DX5SDK\SDK\LIB(我们假定DirectX 5 SDK安装在C:\DX5SDK\ )。
最后,设置链接时所需的库文件。打开在Project菜单中Settings/Link,在Category下拉框中选择General,然后在Object/Library模块列表框加入Ddraw.lib和Winmm.lib即可。 

(三)我们的第一个DirectX程序
我们打算以DirectX SDK所带的例子程序‘DDEX1’作为讲解的基础,因为这样做起码有以下几个好处:(1)大家手里都有正确的源程序,当你辛辛苦苦输完一段程序后,但在编译时不幸出现错误,你就不会不知所措了,可以对照源程序。(2)我也不用再把所有的代码都搬到纸上,这样我们可以更详细的介绍DirectX的重点内容。(3)可以培养你读别人程序的能力,以后学习起来就会更轻松。
既然如此,还等什么呢?还记得我们已经建立了一个新的工程‘MyDirectX1’吗?现在打开Project/Add to Project/Files,浏览目录 DXSDK\SDK\SAMPLES\DDEX1,并选择该目录下的所有文件,点击‘OK’就把它们加入到‘MyDirectX1’中了。好了,现在就打开‘DDEX1.CPP’看看吧。

1、在使用 DirextDraw之前,首先需要创建一个对象DirectDraw的实体,该对象实体代表微机的显示适配器。然后,才能使用接口所提供的方法来操作该对象实体,使之完成有关命令和任务。
所以程序的开头先声明了一个DirectDraw对象:

LPDIRECTDRAW lpDD;


然后如下创建该对象 :

HRESULT ddrval;
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
{
    // DirectDraw 对象lpDD创建成功
}
else
{
   
// DirectDraw对象不能被创建
}


2、接下来设置协作层的运行方式。即DirectDraw程序的运行方式,指整屏模式、窗口模式、MODEX模式等。
HRESULT ddrval;
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if( ddrval == DD_OK ){
   
// 全屏独占方式设置成功
}
else {
    // 设置失败
}


3、设置显示模式,即屏幕分辨率和色彩数。
HRESULT ddrval;
ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
if( ddrval == DD_OK ) { 
   
// 成功的把屏幕设置成了640X480X256色
}
else {
    // 显示模式不能改变
}


4、创建表面。我们可以把表面看成是一块内存缓冲区,所有的操作都是对缓冲区进行的,操作完成后只须把整个缓冲区翻转成主表面(显存)即完成了快速写屏。利用这种技术,就可以实现平滑无闪烁的动画效果,下面讲解如何创建表面。
创建可切换式表面(Surface)的第一步是:在DDSURFACEDESC结构中设定表面(Surface)的各项参数,请看下面的程序:

// Create the primary surface with 1 back buffer.
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd,dwBackBufferCount = 1;


在以上几行中,DDSURFACEDESC结构的大小被赋给dwSize成员。这样做可防止你在调用DirectDraw的方法时返回一个无效值,且便于今后DDSURFACEDESC结构的扩展。
成员dwFlags用于标明DDSURFACEDESC结构中哪些区域填入的信息有效,哪些区域的信息无效。程序中,我们用dwFlags表明了你要使用结构DDSCAPS(DDSC_CAPS),以及你要创建一个后台缓冲区(DDSD_BACKBUFFERCOUNT)。例程中成员dwCaps包含了一些用在DDSCAPS结构中的标志。这样一来,成员dwCaps就定义了一个主表面(Surface)(DDSCAPS_PRIMARYSURFACE),一个弹出式表面(Surface)(DDS-CPAS_PRIMARYSURFACE),和一个复表面(Surface)(DDSCAPS_COMPLEX)。所谓复表面(Surface)是指,该表面(Surface)是由若干子表面(Surface)组成的。最后,上面的例程定义了一个后台缓冲区。这个后台缓冲区是我们真正进行操作的内存区。操作完成后,再把它们从后台缓冲区弹到主表面(Surface)上就行了。在这里,后台缓冲区的个数被设为1。但你可以设置任意多的后台缓冲区,只要你的内存允许的话。
填完了DDSURFACEDESC结构,就可以使用该结构和lpDD创建表面的指针了:

ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval == DD_OK ) {
   
// lpDDSPrimary 指向主表面
}
else{
    return FALSE;
}

如果调用成功,则IDirectDraw::CreateSurface函数返回指向主表面的指针lpDDSPrimary 。然后调用 IDirectDrawSurface::GetAttachedSurface 取得后台缓冲区的指针:

ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface( &ddcaps, &lpDDSBack );
if( ddrval == DD_OK ) {
   
// lpDDSBack 指向后台缓冲区
}
else{
    return FALSE;
}

如果IDirectDrawSurface::GetAttachedSurface调用成功的话,lpDDSBack 就指向后台缓冲区了。现在我们就可以对后台缓冲区进行各种的操作,把想显示的内容写进去。比如游戏,我们就先调入背景图象,然后再调入各种角色当前应显示的图象,最后是‘对白’、‘文字’等。全部完成之后,把后台缓冲区和主表面进行翻转,就把你想要的东西显示出来了。

5、翻转表面

while( 1 ) {
   
HRESULT ddrval;
    ddrval = lpDDSPrimary->Flip( NULL, 0 );
    if( ddrval == DD_OK ) 
    {
        break; //翻转完成,退出循环
    }
    //如果表面丢失了 
    if( ddrval == DDERR_SURFACELOST ) 
    {
        ddral = LpDDSPrimary->Restore(); //恢复表面
        if( ddral != DD_OK )
        {
            break;//恢复成功,退出循环
        }
    }
    //如果前一次表面翻转还未发生
    if( ddrval != DDERR_WASSTILLDRAWING )
    {
        break;
    }
}

例中,lpDDSPrimary指明了主表面及其后台缓冲区。调用IDirectDrawSurface::Flip后,主表面和后台缓冲区交换。如果调用成功,返回DD_OK,程序终止While循环;如果返回DDERR_SURFACELOST,表明可能是表面丢失,需要用IDirectDrawSurface::Restore 恢复该表面,若恢复成功,就再一次调用IDirectDrawSurface::Flip方法;如果失败,程序终止While循环并返回一个错误值。另外,即使IDirectDrawSurface::Flip调用成功,交换也不是立即完成,它将等到系统中在此之前的表面交换都完成后才进行。如果前一次的表面翻转还未发生,IDirectDrawSurface::Flip 就返回DDERR_WASSTILLDRAWING。IDirectDrawSurface::Flip将继续循环直到返回DD_OK。

6、结束程序之前别忘了用Release()释放你建立的对象。

if( lpDD != NULL ) 
{
   
if( lpDDSPrimary != NULL ) {
        lpDDSPrimary->Release();
        lpDDSPrimary = NULL;
    }
    lpDD->Release();
    lpDD = NULL;

OK!大功告成。运用以上的手段我们就可以作出基本的DirectX程序了,不过不要高兴的太早,DirectX远比你想象的要庞大的多!我们所涉及的不过是一点皮毛而已(仅包括了DirectDraw),要想全面掌握DirectX编程的技巧,你还须付出艰辛的努力。我的建议是多上机,多看书,多读读别人的程序,只有这样才能快速提高自己的水平。
好了,今天我们就先聊到这里,希望这能对你有所帮助,如果有机会的话,我想我们还会见面的。当然,你也可以写信到这里 wj77@990.net,大家交个朋友嘛!下次见啦!

 
我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 DirectX编程技术

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00174