第1章 DirectX导论
从某种程度上讲,游戏编程和开发是**潜力且激动人心的行业。它发展迅猛、���有挑战性并带给那些为之努力工作并且超越极限的人非常丰厚的回报。游戏开发需要一批极富创造力的人协同工作,从而开发出新的游戏产品。这些人包括软件开发人员、作家、音效师、数学家、物理学家、艺术家以及许多其他人员。每个人面临的职责、应对的挑战和得到的回报也各不相同。游戏产业自诞生以来,规模已得到长足发展。现在它已经可以和诸如电影、音乐、电视这样的产业竞争。这个每年可以带来数百亿美元利润的产业随着时间的推移、技术的强大和效率的提高也在不断地增长。视频游戏已经存在数十年了,而且还在快速增长。随着越来越多游戏玩家的成长,游戏产业带来的经济利润就越来越大。大部分购买游戏的人都是成年人。这没有什么值得奇怪的,因为大多数孩子没有很多的钱去购买游戏,而等到他们长大成人后,就有钱买游戏了。
游戏开发并不总是充满乐趣和令人兴奋。开发交互式软件是一件艰苦且充满挑战的事情,对此从来都不要掉以轻心。开发游戏像玩游戏一样有趣,但同时需要做大量的工作和付出很多的心血。许多人一想到这一点就会因气馁而放弃。游戏开发中*困难也是*让人有挫折感的部分是学习如何开发游戏的方法。学习基础知识就会为你今后提高能力和技术水平打下坚实的基础。如同在任何领域中一样,通常需要耗费几年的时间才能开发出专业级别的游戏,只要有耐心、冲劲和决心,就能做到这一点。
本书为读者介绍使用DirectX开发游戏的方法。本章将介绍DirectX,更确切地说是Direct3D图形知识。随着本书的深入,读者同样会学到绘图技巧、输入设备检测和响应、声音回放、场景管理、动画、模型/角色的加载和绘制等内容。
1.1 本书概述
本书将使用DirectX软件开发包(SDK)开发一个名为Stranded的**人称射击游戏。本书从头至尾将为该游戏编写代码,这样可以给读者一个清晰的概念,即在DirectX基础上开发游戏所需掌握的内容。某些章节的结尾处有一些名为“游戏项目”的内容。这样可以将在当前或前面章节中学到的知识运用到本书的游戏项目中。到学完本书时,读者会在开发自己的**个3D游戏方面取得进步。
本书分为5个部分。**部分涉及到DirectX图形学的基础知识,包括Direct3D的安装和使用,DirectX中控制屏幕渲染等内容。读者具备这些基础知识后,就可以立即开发出一个短小而且包含Direct3D场景的演示程序。这些基本技能包括绘制基本图形和对象,在几何图形表面显示图像,在屏幕上创建和显示文本以及学会3D场景中的游戏开发方法。
本书第二部分涉及到游戏中共用的编程数学知识和碰撞检测。这部分内容非常重要,因为游戏以及其他交互娱乐平台都涉及了大量的数学知识。从渲染图形到移动人物等,所有这些都需要数学知识。使用本书或学习游戏开发时,读者不必具备很高的数学水平,但经验越多,事情做起来就越容易。
本书第三部分将介绍输入和声音这部分内容。在此,将介绍DirectX家族中的两部分内容:Direct Input和Direct Sound。这些章节同样也很重要,因为能够和软件进行交互(输入)非常重要,这会让产品更像一款真正的游戏。声音增加了游戏真实感,并通过影响场景中的状态和氛来增强玩家的体验。
本书第四部分讨论了模型加载和动画制作。这几章集中讨论了从文件中加载复杂模型和在3D中将数据用动画形式逼真地显示出来的内容。了解游戏数学和DirectX(Direct3D)渲染知识,就可以让人物逼真地在环境中移动。
本书*后一部分将完成整个游戏的开发工作。此时,读者已经做了大量的工作。这些章节将“整理”在前面章节中学习过的知识,并*终开发出成品游戏。尽管从编码角度而言,该游戏非常简单,但它将会让读者终身获取非常宝贵的学习经验。
读者学习完本书后,一定要查看附录A中**的书籍和网站。从中可以获取将来在游戏开发中加深学习而要用到的补充资源和参考资料。
1.1.1 编写本书的目的
本书旨在使用入门级游戏程序员知识,开发一个简单的**人称射击游戏。读者通过编写该游戏,将了解到游戏设计和开发的整个过程。此外,读者同样可以开发一个让自己的朋友和家人留下深刻印象的游戏。
虽然读者在学习本书时,不需要有任何的游戏开发和DirectX使用经验,但是应该有一些编程经验。本书是一块垫脚石,它将带领读者进入到游戏开发的广阔空间中。本书并不是一本涉及到游戏开发全部内容的“**指南”,它只是一个开端。读者可以将其作为一本参考资料加以收藏,在将来需要时可以在其中查找对自己有用的信息。
1.1.2 读者对象
本书面向的读者是那些希望在Windows操作系统上使用DirectX进行游戏开发的C++程序员。虽然读者不一定要是C++大师,但掌握这方面的知识对读者大有裨益,例如掌握面向对象编程。另外,读者不必有任何游戏编程或图形编程经验,就可以享受到游戏开发的乐趣,并从本书获取大量有用的信息。本书仅涉及面向对象编程和软件开发的一般主题,非常适合那些以此为爱好的程序员、学生以及希望在这个行业中找到工作的人阅读。
如果读者想要学习DirectX,但是又没有任何编程经验,则可以参阅附录A中列出的一些书籍。这些书籍有助于读者在编程方面的入门。同样,附录中还**了一些该领域的书籍和资源,它们有助于提高读者的技能水平,这些资源已超出了本书的讨论范围,包括编程、软件开发、数学、人工智能、物理学以及**图形学和引擎编程等。
1.1.3 工具和资源
本书基于DirectX 9.0进行开发工作,所以读者务必要有一套*新版的DirectX 9.0软件开发包(DirectX 9.0 SDK)。读者可以从Microsoft公司的www.Microsoft.com/DirectX网站上下载该软件开发包。本书的代码示例同样可以使用Microsoft公司的VisualStudi0.NET 2003集成开发环境编译。读者也可以使用以前版本的Visual Studi0集成开发环境,但要在该环境中创建自己的项目,以便对代码示例进行编译。如果读者有*新版本的Visual Studio,就可以直接打开用Visual Studio.NET 2003开发的项目而不会出现任何问题。
除了附录A中提到可以帮助读者提高编程能力的资源外,读者还可以登录到www.UltimateGameProgrammin9.com网站,使用该网站提供的资源。读者在此可以找到一个提供大量游戏开发知识和文章的社区,这些知识和文章涉及多个不同专题,供读者学习使用,以帮助读者解决学习过程中遇到的问题。像可以随意下载代码示例一样,读者可以自由参与网站上的各种讨论。
1.2 游戏规划
如前所述,本书旨在开发一款简单的DirectX**人称射击游戏。通过本书大部分章节中*后一部分“游戏项目”的渐进学习,读者就可以完成这款游戏的开发工作。读者通过本书前面四分之三内容的学习,可以编写简单的引擎代码,它可以作为*终游戏的开发基础。剩下四分之一的内容将编译和完成*终的游戏。随书光盘提供了本书中所有的开发代码。
1.2.1 项目Stranded概述
游戏Stranded的风格与《雷神之锤》(Quake)和《虚幻》(Unreal)这类游戏很相似。游戏是在名为Stranded的游戏引擎基础上开发的。本书通篇都是同时进行游戏引擎和游戏的开发工作。每章将会解开游戏开发的一部分难题,直到完成一个简单的3D游戏为止。当读者学完本书时,如果想要将自己的工作提高一个层次,那么书中提供的任何代码都很容易扩展,或是可以毫不费力地更换其中的代码。
可以使用键盘和鼠标或游戏垫(game pad)等输入设备玩游戏。如果喜欢的话,读者可以添加其他设备,因为Directlnput作为DirectX的输入,可以方便**地检测所有输入设备。同样,游戏可以为武器提供3D声效,如同在点击游戏主菜单时出现的环境音乐。3D声音似乎是从游戏中某个位置发出的声音。声音文件主要采用.wav格式,可以使用如Reason 3.0这样的声音/音乐开发软件编制。
Stranded在环境和环境物体的重力和碰撞中用到了简单的物理学知识。由于物理学是一个不可能详细介绍的庞大领域,所以只能对简单的内容加以介绍。书中同样还介绍了简单的脚本系统,这样初学者可以涉足脚本系统这一领域的学习。同样,附录A还**了可以帮助读者开发更复杂脚本系统的资源,当然也可以使用现有的脚本系统。在学完本书后,有些程序员可能希望开发出更复杂的脚本系统。
从图形角度而言,游戏非常简单,因为本书目标只是对游戏编程做一个入门级介绍。如果希望深入开发工作,读者在学完本书后,添加更**的图形也是不难实现的。实际上,可以使用本书的源代码创建更**的图形,一方面由于本书空间所限,另一方面因为这也超出了本书的讨论范围,所以本书删除了这部分内容。
游戏中使用的人工智能(AI)非常简单。人工智能是一个巨大的研究领域,它能真正让游戏给人留下深刻印象,让人愿意去观看和进行交互。人工智能使读者可以和游戏自身进行交互,但它并不能模仿*新*好的游戏。任何学完本书的人都可以在编写代码基础上,继续开发更**和效率更高的人工智能。
游戏本身很简单。主角是一个陷落在地球上的外星人。**个任务是主角为了返回家乡,要找到一个像飞船一样的物体。在寻找该物体的过程中,主角会遭遇试图抓他并获取其技术的敌人。这意味着有两类角色:敌人和外星人。每一类角色可以共用一种武器。同样,游戏只有单场景:一座荒岛。一旦开发完这个基本游戏,读者就可以为其添加更多的武器、角色、场景等。
1.2.2 设计概述
如果读者计划涉足游戏开发领域,那么游戏设计是要面对的一个重要而广泛的领域。关于这一主题,有很多文章和书籍可以引导读者进入该领域的学习。然而,本书只是开发一个短小而简单的游戏,因此不需要很多的游戏设计知识就可以完成开发工作。这并不意味着无需进行游戏设计。实际上,由于本书关注的是DirectX和游戏编程,因此它采用了一种非常规的方法替代专业的游戏设计。附录A**了许多游戏设计资源。因为游戏设计本身也可以用一本书来诠释,所以本书像对待其他部分一样,并未用太多的篇幅来讨论这个主题。第2章将讨论游戏规划,但目前仅对该主题稍作介绍。
在开始真正的游戏开发前,需要编写大量的代码来构建本书的项目游戏。所有现代游戏都运行在一个称为游戏引擎的平台上。游戏引擎指的是可以确保在较高层面上运行游戏的代码集。例如,可以编写负责渲染工作的代码,而不是直接和Direct3D(或OpenGL等)打交道,这样可以构建一个封装在场景后面的渲染引擎,而任何使用该代码的人都只需考虑渲染引擎即可,而不用考虑它要用到的图形用户界面(GUI)。这样在底层改动代码.时,例如用OpenGL替代Direct3D,那些使用游戏引擎的人会对此毫无察觉。同样,在学习过程中,本书中的项目需要一些可以使编译、调试和纠错等工作简化的功能。这包括错误日志记录系统、简单的脚本运行等。
1.2.3 引擎设计概述
如前所述,游戏引擎是一系列**代码,读者可以以它为基础开发自己的游戏。现代游戏引擎已经对那些使用它的人隐藏了底层实现的细节和规范。例如,可以在OpenGL和Direct3D的基础上开发渲染引擎,这样,引擎用户就不需要知道使用的是哪一个渲染引擎,尽管用到了一些底层的东西。读者可能会说,那样游戏引擎会变得很复杂。游戏引擎包括:渲染引擎、物理引擎、声音引擎等。游戏引擎本身只是一个由更小的引擎组成的集合。游戏引擎或它涵盖的内容并没有一个**的定义。对视频游戏而言,它的游戏引擎至少要包含渲染引擎和输入引擎,这是必需的,否则,就不能称其为交互式游戏。
由于游戏引擎开发这个主题很复杂,所以本书并不会试图去开发一个很庞杂的游戏引擎。实际上,本书将在构成DirectX的不同APl基础上开发出一个简短的游戏引擎。学完本书足以让读者了解引擎,读者不只是可以编写出一个简单的游戏引擎,还可以在这个引擎上继续开发工作或对其改动以满足自己的需求。对于那些讨论引擎体系结构和开发的全部资源而言,这不是问题。虽然没有一本书讨论了类似的游戏引擎的开发,但它们都会给读者提供宝贵的提示、想法,并**读者深入考虑开发代码的方法。
本书的游戏引擎包括构建在Direct3D基础上的渲染引擎、构建在Directtnput基础上的输入系统、构建在DirectSound基础上的声音系统、处理碰撞和运动的物理系统、动画系统和一个简单的人工智能系统。该引擎代码还包括创建错误日志、使用命令和属性脚本的基本脚本能力和图形用户界面(GUI)系统。GUl系统用于创建主菜单、加载场景等。
Stranded游戏引擎中并未涉及网络系统,这是因为网络是个很庞大的主题,它超出了本书为初学者介绍的知识范围。其他一些系统至少可以做一些简化,而网络系统编写起来并不容易。当然并非所有的网络系统代码都很高深,或是很庞大,但要了解的内容已经超出了本书的讨论范围。由于本书不是一本讨论引擎开发的书籍,所以只关注DirectX的不同组成,并将其集成在一起开发出一个简单的游戏。游戏程序员和游戏引擎程序员完成的是两种不同的工作。游戏程序员只与开发游戏的游戏引擎打交道,而游戏引擎程序员要开发出其他人用于开发游戏的引擎。