DirectX5.0最新游戏编程指南

本文是一份DirectX5.0的游戏编程教程,详细介绍了如何配置DirectX SDK,包括针对Microsoft Developer Studio和Borland C++5.0的设置。文章通过创建第一个DirectDraw实例,讲解了初始化DirectDraw对象、创建DirectDrawSurface、设置显示模式、创建可翻转表面的步骤。此外,还探讨了DirectDraw中其他的相关应用,如创建动画、使用覆盖表面等,是初学者掌握DirectX编程的良好起点。
摘要由CSDN通过智能技术生成
DirectX5.0最新游戏编程指南

一 配置DirectX SDK 2
1.1 配置Microsoft Developer Studio 2
1.2 配制NMAKE路径 3
1.3 为Borland C++5.0配置DirectX SDK 3
二 第一个DirectDraw实例 3
2.1 首先初始化DirectDraw对象 4
2.2 创建DirectDraw 对象 5
2.3 设置显示模式 5
2.4 改变显示模式 6
2.5 创建可翻转表面(Flippable Surface) 6
2.6 定义表面要求 6
2.7 创建表面 7
2.8 着色表面 8
2.9 写表面及翻转表面 8
2.10 释放DirectDraw 对象 10
2.11 将位图调入表面 10
2.12 设置调色板,将位图调入后台缓冲区 11
2.13 从屏外表面位块传输 12
2.14 将位图文件调入屏外表面 13
2.15 将屏外表面位位块传输到后台缓冲区 13
三、创建动画 14
3.1 Color Key和位图动画 14
3.2 DDEX4中的动画 15
3.3 动态改变调色板 15
3.4 替换调色板 15
四 使用覆盖表面 16
4.1 创建一个主表面 16
4.2 检测硬件对覆盖的支持 17
4.3 创建一个覆盖表面 17
4.4 显示覆盖表面 19
4.5 更新覆盖的显示位置 22
4.6 隐藏覆盖表面 23
五 DirectDraw中其它的DirectDraw范例 23



DirectDraw教程篇

DirectX是为Visual C++的用户准备的,因此要编制DirectDraw游戏程序,最好对VC要有一定的了解。不愿意使用VC的用户也可以利用Arakelian Soft公司开发的专门针对Visual Basic5.0用户的ActiveX控件DirectStudio98或Tegosoft公司的TegoSoft ActiveX for Visual Basic。不过,如果想充分发挥DirectX的性能,并且希望保持程序的兼容,那么最好还是使用Visual C++。
为了叙述方便,假定已经安装了DirectX5.0 SDK 和Visual C++ 5.0,其目录分别是C:/DX5SDK和C:/Program Files/DevStudio。如果你使用了另一种编译器或安装到了其它目录下,必须将下面的例子做适当的修改才能运行。有人安装了DirectX SDK后却不知怎样使用,因为它是基于Visual C++的,却没有一个界面友好的集成开发环境,因此必须对Visual C++进行适当的配制。

一 配置DirectX SDK
1.1 配置Microsoft Developer Studio
  为了编译DirectX SDK提供的例子,需要打开一个新的project workspace,插入适当的文件,设置环境变量使得编译器能够找到需要的链接库和包含文件,下面描述了设置的全部过程。启动Microsoft Developer Studio,安装下述步骤创建工程:
.在File菜单,选择New;
.在New对话框中选择Project中的Win32 Application,在Project Name输入DDEX1
.在Location文本框输入放置工程文件的位置,点OK按钮
.一个新的DDEX1 Classes文件夹就出现在workspace窗口的左边了。
创建了工程后,需要使用如下步骤向工程插入适当的文件:
.在Project菜单选择Add toProject|Files
.浏览到C:/DX5SDK/SDK/SAMPLES/DDEX1 目录,选择所有的文件
.选择OK,该目录下的DDEX1.CPP、DDEX1.RC、RESOURCE.H就加入到工程了。
然后设置包含文件的路径:
.在Tools菜单,选择Options,就弹出Options对话框
.选择Directories ,在Show Directories For列表框选择Include files
.在Directories:列表框双击列表底部的空白行,输入C:/DX5SDK/SDK/INC.
.同样再加入另一个路径C:/DX5SDK/SDK/SAMPLES/MISC
.选择OK按钮,
设置链接库目录:
.在Show Directories For列表框选择Library files
.在Directories:列表框双击底部空白行,输入C:/DX5SDK/SDK/LIB.
.单击OK按钮。
最后设置建立应用程序时链接的模块:
.在Project菜单单击Settings.
.选择Link
.在Category下拉框选择General.
.在Object/Library模块列表框加入Ddraw.lib和Winmm.lib.
.单击OK.
1.2 配制NMAKE路径
  有时候命令行的方式比集成环境更加方便,所以许多有经验的程序员更愿意用命令行的方式来建立应用程序。下面是包含文件和链接库模块的路径:
@echo off
set PATH=C:/Program Files/DevStudio/SharedIDE/Bin;
  C:/Program Files/DevStudio/Vc/Bin;%PATH%
set INCLUDE=C:/Program Files/DevStudio/Vc/include;
  C:/Program Files/DevStudio/Vc/Mfc/include;C:/DX5SDK/SDK/INC;%INCLUDE%
set LIB= C:/Program Files/DevStudio/SharedIDE/Vc/lib;
  C:/Program Files/DevStudio/Vc/Mfc/lib; C:/DX5SDK/SDK/LIB;%LIB%
set INIT= C:/Program Files/DevStudio;%INIT%
将上述内容加入Autoexec.bat。在例子的目录下输入
NMAKE
将会在当前目录下创建一个DEBUG目录,并将生成的可执行文件放在该目录下。
为了在学习的过程中熟悉DirectX SDK,我们将按照DirectX SDK提供的范例程序的顺序由浅入深,循序渐进。
1.3 为Borland C++5.0配置DirectX SDK
尽管DirectX 5 SDK是主要为Visual C++用户准备的,但Microsoft并未忘记众多的Borland
C++用户,所以在DirectX SDK中也提供了DirectX的Borland C++库。不过,可能出于竞争的缘故(猜测而已),安装后的DirectX SDK中并没有Borland C++库。这就需要用户自己来处理这一恼人的问题了。我们知道,DirectX 5 SDK是以一个IDX5SDK.EXE发布的,运行IDX5SDK后,它先将压缩的文件全部解压到某个目录下(如D:/DX5SDK),然后再运行该目录下的SETUP.EXE安装DirectX SDK(假设目录为C:/DX5SDK)。实际上,在解压后的目录中包含了一个D:/DX5SDK/SDK/LIB/BORLANDC目录,该目录下就是Borland C++的链接库文件。但在SETUP安装时,安装程序并没有把该目录复制到安装目录中。解决方法很简单,即SETUP安装完成后,再建立一个C:/DX5SDK/SDK/LIB/Borland,将目录D:/DX5SDK/SDK/LIB/Borland下的所有文件都复制到C:/DX5SDK/SDK/LIB/Borland目录下。然后在Borland C++5.0的集成环境中如同配置Visual C++5.0那样配置工程文件。

二 第一个DirectDraw实例
要使用DirectDraw,首先必须创建DirectDraw对象的一个实例来表征计算机上的显示适配卡,然后使用接口方法来处理对象。另外还需要创建一个或多个DirectDrawSurface对象的实例来显示游戏。DDEX1首先创建一个DirectDraw对象,再创建一个主表面(primary
surface)和一个后台缓冲区(back buffer),然后在表面之间转换。DDEXx例子都是用C++写成的,如果你使用的是C编译器,必须将代码做适当改动,至少要加入虚表和指向接口方法的指针。
2.1 首先初始化DirectDraw对象
DDEX1 程序在doInit函数包含了DirectDraw 的初始化代码:
// 创建主DirectDraw 对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
{
// 获取独占模式
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE| DDSCL_FULLSCREEN );
if(ddrval == DD_OK )
{
ddrval = lpDD->SetDisplayMode(640, 480, 8 );
if( ddrval == DD_OK )
{
//创建带有一个后台缓冲区的主表面
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |DDSCAPS_FLIP |DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval == DD_OK )
{
//获取后台缓冲区的指针
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval=lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);
if( ddrval == DD_OK )
{
// 画出一些文本
if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
{
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg) );
lpDDSPrimary->ReleaseDC(hdc);
}
if (lpDDSBack->GetDC(&hdc) == DD_OK)
{
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szBackMsg, lstrlen(szBackMsg) );
lpDDSBack->ReleaseDC(hdc);
}
// 创建翻转页面的计时器
if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
{
return TRUE;
}
}
}
}
}
}
wsprintf(buf, "Direct Draw Init Failed (%08lx)/n", ddrval );
............
下面详细说明初始化DirectDraw 对象的创建和准备表面的每一步骤。
2.2 创建DirectDraw 对象
创建DirectDraw 对象的一个实例,应该用DirectDrawCreate API 函数,也可以用COM中的CoCreateInstance函数。DirectDrawCreate用一个全局统一标志符GUID(Globally
Unique IDentifier)来表征显示设备,在大多数情况下GUID为NULL(使用系统的缺省显示设备,既“空设备”);指针指向DirectDraw对象的地址;第三个参数总是NULL(供将来扩展使用)。下述代码表明了如何创建一个DirectDraw对象,并且检验是否成功。
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
{
// lpDD is是合法的DirectDraw 对象
}
else
{
// DirectDraw对象不能被创建
}
2.3 设置显示模式
设置DirectDraw 应用程序的显示模式需要两步:首先调用IDirectDraw::SetCooperativeLevel方法来设定该模式下的要求,一旦确定了要求,再用IDirectDraw::SetDisplayMode方法来选择显示分辨率。
在改变显示分辨率之前,还必须通过IDirectDraw::SetCooperativeLevel方法来指定DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN标志。
  这样能使游戏程序完全控制显示设备,其它的应用程序不能同时共享显示设备。DDSCL_FULLSCREEN标志表示将程序设为全屏模式。下面的代码显示了如何使用IDirectDraw::SetCooperativeLevel方法:
HRESULT ddrval;
LPDIRECTDRAW lpDD; // already created by DirectDrawCreate
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if( ddrval == DD_OK )
{
// 全屏独占方式设置成功
}
else {
// 调用不成功,但程序仍然能继续运行
}
如果IDirectDraw::SetCooperativ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值