DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白


    

在开场白之前的说明:

 

这是“DirectX 9.0c游戏开发手记”的第一部分,叫做“‘龙书’第二版学习笔记”,讲的是我做“龙书”第二版(原名Introduction to 3D GameProgramming with DirectX 9.0c —— A ShaderApproach)的习题的心得和疑惑。

注意:这系列博文并不是什么入门教程,其实说白了就是一个类似自我总结的东西,方便我随时回顾的。没有正在学习DirectX编程的读者可能完全看得云里雾里;然而对于正在学习DirectX编程(最好是正在学习“龙书”第二版)的那些读者来说,这系列博文确实是值得一看的。当然这里面会给出我学习过程中的许多疑惑,希望大家一起来探讨!

 

 

 

开场白:

 

这是本人这是“DirectX 9.0c游戏开发手记”的第一部分“‘龙书’第二版学习笔记”的第一篇,所以还是有必要做一点开场白的。为了便于阅读理解,我采用一问一答的方式来组织这部分文章。

 

Q:为什么要学习游戏编程?

A:这里我要开始讲述“阿毛的故事”了,没兴趣的可以直接跳到下面的问题,只要你对游戏编程有兴趣就行……

去年9月份我想找一款棋子造型很华丽的国际象棋游戏。其实在这之前已经有一款不错的符合要求的游戏了(叫做《战斗版国际象棋》(Battle VS Chess)),可是早就玩腻了,想换换新口味。然而找来找去都没有找到符合要求的。《中世纪国际象棋》是一款“类似”的棋子造型是人物、有打斗动作的游戏,可是操作太坑了,而且毕竟太老,画质是渣渣。后来又见到一款比《战斗版国际象棋》稍早的游戏《鲁克斯保卫战》(Rooks Keep),比《中世纪国际象棋》好多了,但是远远不如《战斗版国际象棋》(当然也有一些优点),最主要的体现在这几点:1、棋子造型难以与实际兵种相对应;2、人物太挤了,尤其是那个蜘蛛皇后,胳膊都跑到别人的地盘了;3、操作很不和谐,视角也很坑。后来再找,没有看到有这种以人物模型为棋子造型的国际象棋了。我彼时悲愤交加,遂决定自己开发一款能够载入人物模型的国际象棋软件!于是我便开始自学C++。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第1张图片

本来只是打算做一款类似于Win 7自带的国际象棋程序ChessTitan那样的小软件,不过去年十一假期看了国产3D巨制《建木传奇》后,我被它那华丽的特效(以及小狐狸精性感美丽的身躯……)所深深地折服和吸引,便有了更宏大的目标:那就是,做一款类似《战斗版国际象棋》那样的华丽的3D国际象棋游戏!

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第2张图片

不过那时候什么基础都没有,C++才刚开始学(虽然很早以前学过C语言,而且2011年暑假也自学过C++,但是后来碰了壁,就荒废了),也不知道从何入手,所以那半年就专心于C++入门了。

到了今年寒假,自学了一本游戏编程入门书——JonathanS. Harbour写的《Beginning Game Programming》——的一半内容。这本书,像我后来浏览过的很多游戏编程书一样,对于Windows程序的介绍都是一带而过的,所以说一开始跟看天书一样——不过,游戏编程所需要用到的Windows编程知识是很少的,所以过了这一段后也没多大影响。这本书是用DirectX 9.0讲2D游戏编程的,对于3D部分几乎没有任何讲述。当时我也以为要学习3D游戏编程,要从2D游戏编程学起(后来发现这是错误的)。这本书是我从图书馆借的,没有源码(幸亏书上把源码都“原样”誊写了上去,尽管后来发现有一些小问题),而且是中译本,看得很是吃力(当然可能最主要的原因是这本书本身就不够初等)。寒假结束后,也没有获得很大的提高,几乎快要放弃游戏编程了。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第3张图片

后来想想还是老老实实地做一款国际象棋“软件”(而非“游戏”)好了。于是打算自学MFC,因为MFC是制作Windows应用程序最快的工具了。这样学了一个星期左右,倒也逍遥快活,直到某天半夜……

那天半夜我百度了一下用MFC制作游戏,结果发现有人说用MFC制作Windows应用程序还可,但是用来做游戏不靠谱,因为游戏需要快速反映,而MFC的封装太多,运行效率不够快。那天夜里,我想了一阵子,便咬咬牙,准备从Windows程序设计开始学起了。咳!谁让到现在为之还没有出现比《战斗版国际象棋》更加华丽的国际象棋游戏呢?

我找到了《Windows游戏编程大师技巧(第二版)》,然后打算用我之前下载的DirectX SDK (June 2010)版本学习。这本书先详细讲述了Windows程序设计,终于让我对其有了感觉。不过当学习DirectX部分的时候,我又陷入了深深的困惑之中。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第4张图片

一方面是这里讲COM的时候太抽象了,简直是外星语言啊!好容易过了这道坎,然后发现了更恐怖的事实:书里给出的程序没法编译!虽然书里用的是DirectX 8,我用的是DirectX 9,但是不是说DirectX是向后兼容的吗?这不是说只要把里面的8都改成9就行了吗?(后来我才发现我的想法太天真了。)后来终于知道问题所在了:书上的程序用了DirectDraw,但是这种东西在DirectX 9中已经不存在了!郁闷啊!

于是我只好放弃了这本1000多页的书。后来找到了一本神书,叫做《Programming Role Playing Games with DirectX》,作者是名不见经传、但是很牛的Jim Adams,同样是用DirectX 8进行游戏编程的,但是没有用DirectDraw!这让我大喜过望,于是便学了起来,津津有味,而且这书讲得特别有意思,以至于我将我的志向又提高了一个层次:我要做一款值得一玩的3D RPG!

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第5张图片

然而学到后来又出现了问题了:一个函数那里的参数出现了错误!仔细研究了一下,发现这个函数的DX 8版本和DX 9版本的参数数目竟然是不一样的!坑啊!这绝对不是个例!看来即使没有用到DirectDraw,DX 8和DX 9的区别还是大大的呀!

真是“山重水复疑无路,柳暗花明又一村”!正当我心灰意冷之际,我找到了传说中的“龙书”( Introduction to 3D GameProgramming with DirectX 9.0)!晕死,既然DX 8对我无情,那就休怪我无义了!我就从此走上了学习DX 9的路途。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第6张图片

学起来还是挺顺利的。不过我发现这本书的例子都很简单,没有特别激动人心的示例程序。后来偶然发现“龙书”的第二版,用的是DirectX 9.0c版,而且里面的很多例子都挺激动人心的,感觉比前一版提升了好几个档次,便学了起来。PS:到了这里,我才发现,其实即使同样是DirectX 9.0c版本,有一些地方也是有细微差别的,所以幸亏我选对了教材,否则又不知道要走多少冤枉路了。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第7张图片

再补充一下:《ProgrammingRole Playing Games with DirectX》有一个第二版,是用DX 9进行编程的,但是里面的很多代码还是过时了,毕竟年代比较久远了。

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白_第8张图片

这上面说了很多废话,其实要点就两个:一个是一定要有学习游戏编程、做出一款好玩游戏的强烈愿望!二是一定要选择一本编排合理、内容新近、适合初学者学习的游戏编程教材!


Q:为何要用DirectX学习游戏编程?用游戏引擎不是更快吗?

 

A:确实用虚幻3、Unity等游戏引擎开发游戏速度很快,而且现在大部分游戏公司都是用市面上出售的或者自制的游戏引擎制作游戏的。那么为何我们要用DirectX学习游戏编程呢?因为用DirectX还是比较底层的,能够实现更多的自由,能够让我们更加理解3D游戏的本质。而用游戏引擎制作,虽然速度快,但是并不是万能的,有一些功能靠游戏引擎是难以实现或者根本做不到的;况且由于游戏引擎比较注重通用性,一般来说优化并不是很好。此外,即使要用游戏引擎开发,掌握一点DirectX编程的知识还是挺有用甚至是必要的。


Q:为何用DirectX9.0版本?

 

A:现有的最新的DirectX版本是DirectX 11。不过这几年比较出名的3D游戏基本还是基于DirectX9的(这就是玩某些3D游戏需要你安装DirectX 9 Runtime的原因)。之所以这样,因为DirectX 9是面向Windows XP系统的,所以XP系统和它以后的系统都可以正常运行基于DirectX 9的程序(只要安装了DirectX 9 Runtime);而DirectX 11是面向Windows 7系统的,基于DirectX 11的程序只能用于Windows 7及其以后的系统。显然,游戏厂商们希望自己的客户群尽可能广大,所以就选择DirectX 9了。


另外,对于DirectX 9.0c,它能够实现的效果已经很华丽了,大家可以参看《古墓丽影8》等基于DirectX 9的游戏。


至于DirectX 10,由于它是面向WindowsVista系统的,并且在它出现后没多久就出现了DirectX 11,所以我还没有见过基于DirectX 10的游戏。

现在能够下载到的最新版的DirectX SDK(software development kit,软件开发包)是DirectX SDK (June 2010)版本。这个版本集成了DirectX 9.0c、DirectX 10和DirectX 11。我们暂时就只关注其中的DirectX 9部分了。之所以后面带有一个c,是因为DirectX 9也有几个小版本,最古老的是a,最新的是c(其实即使是DirectX 9.0c,也有更细的小版本,前面也提到过的)。


当然,不可能再去管DirectX 8或者更老的版本了,前面的故事中我所得到的惨痛教训想必大家已经清楚了。


Q:为何不写一个教程类的博文?

 

A:首先,我没有那么大的本事来写一个自创的DirectX编程入门教程;其次,“龙书”第二版已经是不错的教程了,尽管有一些地方还是不太好理解。本人最近在对“龙书”第二版进行“修正”,会在每更新完一章的时候给大家分享。这个修正版除了页面编排更美观、修正了网上流传版本的错误以外,还增加了很多脚注,对于书中不太好理解的部分进行了注释。这些不太好理解的地方本人会在今后的博文中适当提及,不过还是推荐大家把电子书下载下来仔细研究,顺便提供宝贵意见!

 

附:

龙书 Introduction to 3D Game Programming with DirectX 9 0c 着色器版彩图注释修正版1.3

点击打开链接


你可能感兴趣的:(C++,游戏开发,DirectX,游戏编程)