DirectXGuide入门

原创 2001年03月25日 01:41:00

DirectXGuide入门

本教学主要介绍DXGuide类库2D部分的一些入门知识,主要包括如何用DXGDD向导
创建一个DirectX程序、翻页、渲染页面等,不管你是高手还是新手,包管你尽快
上手。

1.第一个DirectX程序
2.让你的页面动起来
3.渲染页面
4.从文件中读入位图
5.将你的文件打包
6.......

 

第一个DirectX程序

在开始之前,首先你要下载DXGuid类库的库文件和头文件(注意有调试版和发行版
哦!),这里暂且假定你已经将DXGuid的头文件放在D:/DXGuid/include,库文件
放在D:/DXGuid/lib。然后还要下载一个工程向导DXGDD.awx,将它放在
../Microsoft Visual Studio/Common/MSDev98/Template中(VC++6.0)。最后是设
定DXGuid头文件和库文件的路径,从Tools菜单依次进入Options.../Directorys
,分别在Include files和Library files中加入头文件和库文件的路径。

准备工作完成之后,你就可以开始你的第一个DirectX程序了。进入VC,从File菜
单选择New,在Pogjects表单中选择DirectX Guide's DirectDraw AppWizard,并
在Project name中输入你的工程文件名,如DDTest。
单击OK按钮你就可以生成一个DirectX程序了。

在编译连接之前按Alt+F7进入工程参数设置,在General中将Microsoft
Foundation Classes设置为Use MFC in a static Library。

好了到这里,你的DirectX程序就可以编译运行了,怎么样,还不错吧?程序可以
通过Alt+Enter键在窗口和全屏模式下进行切换。

2)让你的页面动起来

从显屏中我们看到的是正面显存(Front buffer)中的内容,我们同时还可创建一
个或多个反面显存(Backbuffer),就象一张纸有正面和背面一样,我们可以将纸
翻过来看。同样我们可以在Front buffer和Backbuffer之间进行翻页操作。一般
是在Back buffer中进行渲染,渲染好后将它翻到正页即可,翻页后Back
buffer就成了Front buffer,而原来的Front buffer则成了Back buffer,其实
Front buffer 和Back buffer构成的是一个环路,就象立在我们面前的一个立方
柱,正面朝向我们的是正面,其它三个面称为背面。不过编程时这些细节都不需
要我们参与处理。全部过程只需一个函数Flip()就可完成。翻页有什么好处?您
想想看如果我们直接在Front buffer中做渲染,眼睛是可以看到渲染过程的,就
象在黑板上画画,先要将黑板擦干净,再将图一个一个画上去。也就是说每一显
示帧中间都有一个能被眼睛察觉的间隙,看起来会觉得很不舒服。下面我们来看
看如何翻页。

利用Class Wizard转到CDDTest的UpdateFrame()

bool CDDTestApp::UpdateFrame(void)
{
// add your code here !
m_pDDDevice->GetRenderSurface()->Fill(0);

return CDirectXApp::UpdateFrame();
}

将m_pDDDevice->GetRenderSurface()->Fill(0);用以下代码替换:

. . . . . .
static BOOL bOdd = FALSE;
if (bOdd)
m_pDDDevice->GetRenderSurface()->Fill(0);
else
m_pDDDevice->GetRenderSurface()->Fill(0xFFFFFFFF);
bOdd = !bOdd;
. . . . . .

运行后会怎么样?眼睛是不是很不舒服?不过不要紧,下一个教程会好受些。

好象忘了什么?Flip()?哪有翻页动作?我怎么没看见?其实基本的动作DXGuide
都给你封装到基类里了,看到CDirectXApp::UpdateFrame()了没有?你将它改成
m_pDirectDraw->Flip()再运行看看,真对不起,又让你眼花了,下不为例。
 

渲染页面

前面讲到我们的渲染都是在Back buffer里完成的,渲染后再Flip到Front buffer
。那么如何取到Backbuffer呢?我们回到前面一个教程来看看,在前面有这样一
句:m_pDDDevice->GetRenderSurface()->Fill(0);这里的
(CDDDevice*)m_pDDDevice是你当前使用的显卡设备,
CDDDevice主要用于枚举显示设备,也就是说DDGuide支持多显屏,这里暂不多加
介绍,知道m_pDDDevice是什么就可以了。GetRenderSurface()返回的就是此显卡
的Back buffer,返回值类型是CDDSurface*,Fill(DWORD)是CDDSurface是一个成
员函数,用于在buffer里填充颜色。所以Fill(0)是在buffer里填充黑色,
Fill(0xFFFFFFFF)是填充白色。看到这里大家应该知道,其实前一教程就已经做
渲染操作了。下面我们来看看如何在buffer上做一些简单的渲染。

还是用第一个例子中生成的工程来做一些小小的改动,在
CDDTestApp::UpdateFrame()中,将

m_pDDDevice->GetRenderSurface()->Fill(0);

删除,并在此位置插入以下行:

m_pDDDevice->GetRenderSurface()->Fill(0xFFFFFFFF);
CDC dc;
m_pDDDevice->GetRenderSurface()->GetDC(dc);
dc.SetBkColor(0x00FFFFFF);
dc.SetTextColor(0x0000FF00);
dc.TextOut(10,10,"Welcome to DirectX Guide!");
dc.Arc(30,30, 100,100, 30, 30, 40, 40);
dc.MoveTo(30,30);
dc.LineTo(40,40);
m_pDDDevice->GetRenderSurface()->ReleaseDC(dc);

熟悉GDI编程的朋友一定觉得眼熟,不错,这里几乎是一样的,如果你不在乎速度
的话,尽可使用DC,不过建议还是少用为好。好了,编译运行看看,你不觉得帧
数比第一个例子减少了很多吗?

3)从文件中读入位图

这一节要教你如何将位图画到buffer上去。前面介绍过Front buffer和Back
buffer这两种buffer大小与你初始化的分辨率是一样的,还有一种buffer可以为
任意大小,称为Off screen buffer,我们可以将位图预先读到这样的Off screen
buffer中,然后在用到时直接将它Blit到Back buffer,Blit意为位图的块传送
。DXGuide中的CDDDIBSurface类就是专门用于处理位图的,下面我们来看看
CDDDIBSurface的基本用法,仍是利用例一中的工程。

在DDTestApp.h中加入行
#include "DDDIBSurface.h"
利用ClassWizard在CDDTestApp中添加一个成员变量
CDDDIBSurface *m_pDib;
利用ClassWizard转到CDDTestApp::InitDXObjects(void)中,在行
// add your init code here !
后插入下列行
m_pDib = new CDDDIBSurface;
m_pDib->Create(m_pDDDevice, "DXGuide.bmp");
转到CDDTestApp::UpdateFrame(void)中,在行
m_pDDDevice->GetRenderSurface()->Fill(0);
后插入下列行
CRect rect(0, 0, m_pDib->GetWidth(), m_pDib->GetHeight());
m_pDDDevice->GetRenderSurface()->Blt(rect, m_pDib, rect,
DDBLT_WAIT, NULL);
m_pDDDevice->GetRenderSurface()->BltFast(100, 100, m_pDib, rect,
DDBLTFAST_WAIT);
转到CDDTestApp::DestroyDXObjects(void)中,在行
// add your destroy code here !
后插入下行
delete m_pDib; m_pDib = NULL;
在DDTest目录下创建一个名为DXGuide.bmp

Blt和BltFast的用法参照SDK帮助中IDirectDrawSurface::Blt和
IDirectDrawSurface::BltFast的用法。

注意:到这里必须将CDDTestApp.cpp的结构搞清楚,构造函数中的
m_dwAppInitFlags = CDirectXApp::DXAPPIF_DD;
| CDirectXApp::DXAPPIF_DI
| CDirectXApp::DXAPPIF_DS
| CDirectXApp::DXAPPIF_GUIMANAGER;
决定使用哪些DirectX部件,如你不想使用DirectInput,将
CDirectXApp::DXAPPIF_DI拿掉就行了(注意:要
使用GUIManager的话一定要使用DirectInput)。

CDDTestApp::GetDXInitSettings(void)是用于获取初始信息,如选取哪个设备来
显示画面或播放声音。

CDDTestApp::InitDXObjects(void)用于初始化成员变量。

CDDTestApp::DestroyDXObjects(void)用于释放为成员变量申请的内存空间。

CDDTestApp::UpdateFrame(void)用于渲染页面。

你自己加入的成员变量的初始化和释放应该都放在InitDXObjects()和
DestroyDXObjects()中完成。

4)将你的文件打包

为什么要将文件打包?首先是加快文件的读取速度,如果你有几十个甚至几千个
文件放在同一个目录内,打开文件时文件查找是一种费时的操作,如果包装成一
个大文件的话,不管你要读多少个文件,打开文件的操作只有一次;别外还有一
种作用是让目录看起来整洁一些,打包后文件也不会那么直观,别人不会一目了
然看出你的文件都是些什么。

记得前面的读位图语句吧?m_pDib->Create(m_pDDDevice, "DXGuide.bmp"),
CDDDIBSurface的Create可接受四个参数,第一个是CDDevice*, 第二个是位图的
文件名,第三个是CPackFileManager*,第四个是DIB文件类型。其中第三个参数
CPackFileManager*指向的就是一个文件包,如果这项为NULL(缺省),则直接从当
前目录中读位图文件,否则从文件包内读取位图。第四个参数用于告诉函数读取
的DIB是位图(缺省)还是其它格式文件。

我们再回头看看CDDTest的构造函数中有一SetPackFileName(_T(""),
_T("gui.ff"))语句,这是指定包文件
名,第一个参数用于指定一般数据文件包的文件名,第二个参数是GUI相关数据文
件包的文件名,如果指定的文件名是一个目录名,则此目录与文件包同等看待。
第一个文件名指定后,会生成一个CPackFileManager,指针放在成员变量
m_pPackFileManager里。

所以我们把前一个例子中的位图打成包,放于文件包PackFile.ff中,且CDDTest
构造函数中的语句
SetPackFileName(_T(""), _T("gui.ff"))改成
SetPackFileName(_T("PackFile.ff"), _T("gui.ff")),函数
CDDTestApp::InitDXObjects(void)中的语句m_pDib->Create(m_pDDDevice,
"DXGuide.bmp")改为m_pDib->Create(m_pDDDevice, "DXGuide.bmp",
m_pPackFileManager)。再运行看看,是不是一样的?

 

Lucene基础(一)--入门

Lucene介绍lucene的介绍,这里引用百度百科的介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检...
  • fun913510024
  • fun913510024
  • 2015年05月30日 17:55
  • 1759

手把手教你安卓入门(一)

很多同学想学安卓应用开发,但是还没有开始就遇到了很多问题,比如资源无法下载,环境搭建遇到问题,代码不知该从何处写起。从0到1的过程让新手们抓狂。...
  • anddlecn
  • anddlecn
  • 2016年05月20日 15:21
  • 38821

Linux(Ubuntu)入门

1、Ubuntu计算机目录下的各文件夹里面存放的内容/bin/ 二进制可执行文件 /boot/ /cdrom/ /dev/ 设备特殊文件 /etc/ 系统管理目录 /home/ 用户主目...
  • Quason
  • Quason
  • 2016年03月23日 15:07
  • 1754

ACM入门之新手入门

第一章 新手入门1.ACM国际大学生程序设计竞赛简介1)背景与历史1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。1977年,该项竞赛被分为两个级别:区...
  • hncqp
  • hncqp
  • 2007年07月20日 09:45
  • 11995

入门有余, 经典不足 — 小评《C#入门经典》

鉴于C#程序设计语言这本Anders写的书就像是语言规格说明, 我推荐大家阅读C#入门经典(Beginning Visual C# 2010)入门. 说实话, 看到这本书的时候, 我稍微叹了口...
  • vagrxie
  • vagrxie
  • 2013年01月11日 07:21
  • 17478

qt简单入门

qt入门 1.首先我们先创建一个qt的空项目 1.这会生成两个文件 xx.pro xx.pro.user xx.pro文件是qt的工程文件,有点类似于vc的prj文件,或者sln文件。xx....
  • super_man_ww
  • super_man_ww
  • 2016年04月27日 08:57
  • 822

Linux入门-选择自己的发行版

选择自己的发行版是Linux入门遇到的第一个纠结,很多人都会问用什么发型版本最好?这个问题,这一直都是个问题: 1。如果是初次接触Linux的建议就选择ubuntu的就OK了,因为使用ubunt...
  • bestboyxie
  • bestboyxie
  • 2016年09月24日 10:47
  • 422

RecyclerView 最佳入门

ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView ListView和RecyclerView Lis...
  • gusgao
  • gusgao
  • 2016年08月22日 01:36
  • 1080

学习计算机视觉的入门书籍

计算机视觉入门书籍总结,包括书名和部分作者名字,作者名字有漏写和错写。。...
  • bjfhhtjj
  • bjfhhtjj
  • 2016年08月24日 14:41
  • 1179

linux驱动编程入门---hello,kernel

学习linux内核模块编程,第一个小程序当然是hello,kernel!了,这应当算是一个惯例了。以前大三的时候在实验课上做过模块编程,记得当时还是许师兄带我们的实验,不过现在又忘了。晚上试了试,很快...
  • shanzhizi
  • shanzhizi
  • 2013年02月28日 16:30
  • 2754
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectXGuide入门
举报原因:
原因补充:

(最多只允许输入30个字)