《3D游戏编程入门C#》讲解.docx

上传人:b****6 文档编号:5961659 上传时间:2023-01-02 格式:DOCX 页数:117 大小:384.28KB
下载 相关 举报
《3D游戏编程入门C#》讲解.docx_第1页
第1页 / 共117页
《3D游戏编程入门C#》讲解.docx_第2页
第2页 / 共117页
《3D游戏编程入门C#》讲解.docx_第3页
第3页 / 共117页
《3D游戏编程入门C#》讲解.docx_第4页
第4页 / 共117页
《3D游戏编程入门C#》讲解.docx_第5页
第5页 / 共117页
点击查看更多>>
下载资源
资源描述

《3D游戏编程入门C#》讲解.docx

《《3D游戏编程入门C#》讲解.docx》由会员分享,可在线阅读,更多相关《《3D游戏编程入门C#》讲解.docx(117页珍藏版)》请在冰豆网上搜索。

《3D游戏编程入门C#》讲解.docx

《3D游戏编程入门C#》讲解

3D游戏编程入门(C#)

目录 

第I部分 Microsoft.NET简介

第1章 游戏开发和托管代码....3

1.1 什么是.NET?

......3

1.2 什么是托管代码......5

1.3 使用MicrosoftVisualStudio.NET2003IDE编写代码......5

1.3.1 C#代码.....6

1.3.2 VB.NET代码.....8

1.4 在命令行中编译.NET代码......9

1.5 游戏开发简述......10

1.6 开发人员......10

1.7 游戏开发过程......11

1.8 工具......12

1.9 小结......16

第II部分 图形和游戏1的介绍

第2章 策划第一个游戏....19

2.1 提出游戏构想......19

2.2 理解一个3D游戏的需求......21

2.3 游戏规范......24

2.4 小结......26

第3章 理解示例框架....27

3.1 创建项目......27

3.2 枚举所有设备选项......32

3.3 小结......39

第4章 在屏幕上显示....40

4.1 创建设备......40

4.2 开始绘图......47

4.3 加载并绘制网格......48

4.4 在场景中添加照相机......51

4.5 小结......54

第5章 完成代码....55

5.1 理解高分辨率计时器......55

5.2 处理丢失的设备......60

5.3 添加帧速率输出......63

5.4 设计UI界面......65

5.5 设计按钮......72

5.6 小结......75

第6章 实现用户界面....76

6.1 设计主菜单......76

6.2 插入到游戏引擎中......81

6.3 选择人物(Loopy)..84

6.4 利用新界面更新游戏引擎......91

6.5 小结......95

第7章 实现玩家和块....96

7.1 编写Player对象......96

7.2 设计块......104

7.3 小结......110

第8章 实现级别对象....111

8.1 实现级别......111

8.2 控制玩家的移动......116

8.3 处理级别的更新......119

8.4 小结......123

第9章 综合应用....124

9.1 包含玩家......124

9.2 挂钩级别......128

9.3 实现退出界面......132

9.4 结束工作......135

9.5 小结......140

第III部分 基本的数学规则

第10章 3D数学快速入门....145

10.1 2D与3D....145

10.2 使用3D点......147

10.3 操作3D对象......148

10.3.1 平移(移动)对象.....149

10.3.2 缩放.....149

10.3.3 旋转.....150

10.3.4 坐标系.....150

10.4 数学结构......151

10.5 向量......151

10.6 矩阵......154

10.7 小结......157

第IV部分 间接图形、对等网、游戏2

第11章 开始创建游戏....161

11.1 Tankers——下一个游戏构想......161

11.2 创建Tankers项目......163

11.3 项目的图形绘制......169

11.4 为纹理构建对象池......171

11.5 小结......173

第12章 开发更先进的用户界面....174

12.1 使用Blockers的基类(Base类)..174

12.2 添加新的基类......179

12.3 实现主界面......182

12.4 利用用户界面绘制3D模型......189

12.5 小结......193

第13章 绘制真实的坦克....194

13.1 理解网格层次结构......194

13.2 加载坦克层次结构......197

13.3 绘制网格层次......199

13.4 操作坦克......201

13.5 坦克的属性......204

13.6 创建照相机类......207

13.7 小结......210

第14章 天空?

级别?

玩家!

....211

14.1 没有天空的世界将是黑色的世界......211

14.2 有了一个天空,但坦克不能驱动到那里......214

14.3 控制坦克......216

14.4 IMoveableObject接口......225

14.5 基本碰撞检测......231

14.6 小结......234

第15章 准备,瞄准,开火!

....235

15.1 实现Ammunition类......235

15.2 Bullets集合......242

15.3 完成玩家......243

15.4 添加声音......245

15.5 小结......248

第16章 避免单人游戏的枯燥....249

16.1 使用DirectPlay...249

16.2 创建会话......255

16.3 加入会话......257

16.4 事件处理程序......258

16.5 发送及接收数据......260

16.6 小结......265

第17章 完成Tankers游戏....266

17.1 插入到游戏引擎中......266

17.2 绘制游戏......272

17.3 小结......275

第V部分 高级绘图、客户/服务器网络和游戏3

第18章 添加特殊效果....279

18.1 实现基本粒子系统......279

18.2 绘制粒子系统......287

18.3 将各部分连接到一起......290

18.4 小结......292

第19章 构建自己的游戏....293

19.1 阐明思想......293

19.2 创建自己的项目......294

19.3 设计用户界面......300

19.4 小结......305

第20章 可编程流水线....306

20.1 定义可编程流水线......306

20.2 使用HLSL...307

20.3 编写VertexShader..309

20.4 使用着色增加逼真度......314

20.5 添加Pixelshader..315

20.6 小结......317

第21章 控制细节的级别....318

21.1 简化网格......318

21.2 使用简化的网格......322

21.3 使用渐进网格控制细节的级别......323

21.4 小结......324

第22章 使用绘图目标创建特效....325

22.1 绘制跑道和多辆卡丁车......325

22.2 创建绘图目标和表面......331

22.3 将场景绘制到绘图目标......333

22.4 演示后视镜......334

22.5 小结......335

第23章 理解高级渲染语言....336

23.1 理解老的shader模型的限制......336

23.2 添加卡丁车镜面高亮......337

23.3 逐pixel镜面高亮......340

23.4 小结......343

第24章 关于性能的注意事项....344

24.1 事件模型和ManagedDirectX....344

24.2 生成本机程序集......345

24.3 Boxing恶梦......346

24.4 ManagedDirectX的速度......348

24.5 理解方法的开销......349

24.6 小结......350

第VI部分 附   录

附录A 开发级别创建器....353

成为游戏开发人员的条件

我所遇到的每一个开发人员都至少在某一段时间想成为一个游戏开发人员。

对于很多人来说,视频游戏不只是空闲时的一种爱好,他们完全被游戏所吸引。

人们沉浸在这些虚拟世界中,常常梦想由自己创建如此神奇的天地。

不要被美丽的图形、奇妙的故事情节和感人悦耳的音乐所愚弄,编写游戏是非常困难的工作,只有某些特定的开发人员才能够获得成功。

除了所需要的技术天赋之外,一个优秀的游戏开发人员应当拥有其他一些技能,例如,您首先是一个游戏爱好者。

如果不是游戏爱好者,则不可能编写出伟大的游戏,这一条件使得游戏开发工作更具有挑战性。

成为游戏开发人员确实不是一件容易的事情。

如果没有经验,则不会被游戏开发公司聘用,并且当没有公司聘用时,将更难以获得经验。

当前只有少量的课程以及某些学校专注于讲授游戏的开发。

但是,入门的最好方式是制作一个样片(demoreel)。

它能向您未来的老板展示您的能力和处理事情的方式。

通过本书,您将制作出一个引人注目的样片。

读者对象

我常常被问到:

“为什么每个人都想使用.NETFramework编写游戏程序?

”。

其他的问题包括:

“.NETFramework不是只用于Web服务器应用程序的吗?

”,“它不是很慢吗?

”,等等。

对于游戏开发人员(或者未来的游戏开发人员)来说,这些都是很重要的问题,但他们误解了.NETFramework。

.NETFramework不是最新的Web服务器版本,也不是任何服务器组件的扩展。

当然能够使用.NETFramework创建强大的Web服务器应用程序,但是,这并不是它们的全部功能。

.NETFramework包括一种功能强大的客户端应用程序编程接口(API)以及ManagedDirectX,实际上.NET开发人员需要掌握整个DirectXAPI。

利用它能够编写很多新的应用程序,包括游戏。

如果认为.NETFramework只能够编写服务器应用程序,则显得有一点单纯。

您也可以利用它创建复杂的客户端应用程序。

关于.NET的性能问题仍然存在,这些问题也很难简单描述。

当引入一门“新的”语言或者运行库时,开发人员在采用之前,通常比较犹豫。

不久以前,很多游戏仍然是采用汇编语言编写的,因为游戏开发人员不相信C或者C++语言足够快。

.NETFramework也遵循这个规则。

在证明.NETFramework的性能之前,游戏开发人员都会以一种怀疑的眼光看待它。

在本书中,大量的游戏是使用.NET运行库开发的。

事实胜于雄辩,与其喋喋不休地讨论.NET运行库的性能有多好,还不如让本书中一些真实的游戏来证明这一点。

为什么使用.NETFramework

任何曾经编写过Windows程序的人都(无论是否使用.NETFramework)能够认识到,即使使用Win32API编写简单的Windows应用程序都比较困难。

设计.NETFramework的目的是提供一种较简单的方式来执行在Windows程序中一些常见的事情,并且为普通的开发人员自动处理很多问题,例如内存的管理。

利用.NETFramework,开发人员可以省去很多麻烦的任务,例如花费三天的时间寻找一个内存泄漏bug,他们可以将一些功能直接添加到正在编写的游戏里面。

很多情况下,从游戏中删除某些好的特性是因为需要花费大量的时间解决问题,而这些问题.NETFramework已经为您解决。

.NETFramework的另外一个令人感兴趣的特性是语言的中立性。

只要所使用的功能兼容公共语言规范(CommonLanguageSpecification,CLS),则可以采用任何能够使用CLS兼容功能的语言。

过去,VisualBasic开发人员转向使用严格的C++进行编码时,可能比较困难。

现在,VisualBasic.NET开发人员能够较容易的转向C#,因为这两种语言之间仅存在较小的语法差别。

本书中的代码是使用C#编写的。

本书的目的

编写本书的目的是为了满足游戏开发群体的需求,他们缺少关于本书主题方面的信息。

由于不能找到所需要的信息,太多可能成为优秀游戏开发人员的程序员选择了退出。

目前市场上的多数游戏开发书籍是关于2D图形的,它们是比较好的起点,但现在编写的多数游戏几乎全是3D图形的,并且现在的游戏爱好者也希望如此。

并不是不需要继续编写2D游戏,但是如果那是游戏开发人员所能够做的所有,则他所做的可能毫无用处。

本书并不教导您如何去编写一个价值数百万美元的游戏。

而是给出所有的工具和信息,让读者自己学会如何开发3D游戏。

在阅读本书的过程中,将实现两个完整的3D游戏,阅读完本书后,读者将能够设计并实现自己的3D游戏,以使自己成为一名优秀的游戏开发人员。

本书中最后的游戏将留给读者作为一个练习。

作者简介

TomMiller是ManagedDirectXAPI的设计师和首席开发人员。

自1997年开始,他工作于Microsoft公司。

他最初在VisualBasic组工作,后来他喜爱上了游戏和游戏编程,因此进入了DirectX组。

自1999年末,他在DirectX组工作,并且已经使得DirectXAPI(和通常的游戏编程)为更多人所接受。

他也编写了到目前为止最具权威的关于ManagedDirectX库的书籍。

欢迎您的宝贵意见!

作为本书的读者,您同时还是本书最重要的批评家和评论员。

我尊重您的意见,想知道我们在什么地方做得不错,在哪些地方还能够做得更好,您最想看到我们提供哪些方面的内容,以及您希望传递给我们的任何明智的言语。

我们非常欢迎您的评论。

您可以给我们写电子邮件或者直接给我写信,阐明您喜欢或不喜欢本书的哪些方面——以及我们能够在哪些方面改进本书。

请您注意的是,我们不能在与本书主题相关的技术问题方面帮助您。

但是,我们拥有一个用户服务小组,与本书相关的特定技术问题将转寄给他们。

信中务必包含本书的书名和作者,以及您的姓名、电子邮件地址和电话号码。

我们将仔细阅读您的评论,并将它们与本书的作者和编辑共享。

我的电子邮件地址是:

feedback@

信件地址是:

MichaelStephens

AssociatePublisher

SamsPublishing

800East96thStreet

Indianapolis,IN46240USA

读者服务

关于本书和Sams出版社的其他更多信息,请访问我们的网站。

在搜索框中输入ISBN号(不包括连字号)或者书名,就可以查到您想看的书。

也可访问

1.1什么是.NET?

 

如果熟悉了如何利用CLR(公共语言运行库)编写代码后,在面临选择开发语言时,您可能已经知道了您的选择。

在VisualStudio.NET产品的最新版本中,当编写托管代码时,可以使用4种语言:

C#、VisualBasic.NET、ManagedC++和J#。

此外还可以使用从VisualStudio.NET产品之外的第三方销售商处获得的其他语言,例如COBOL或者FORTRAN。

尽管本书中将讨论的概念可以很容易地移植到任何完全兼容CLS(通用语言规范)的语言,但实际的代码将仅包含所提到的前两种语言:

即C#和VisualBasic.NET。

本书中将仅使用C#代码。

您可以从

在本章中,您将学习到:

●      定义.NET

●      托管代码

●      使用VisualStudio.NETIDE

●      在命令行中编译托管代码

●      开发人员

●      游戏开发过程

●      工具

1.1 什么是.NET?

自从Microsoft公司宣布并发行.NET之后,人们一直在尝试指出这种新“事物”到底是什么。

根据Microsoft公司的市场活动,人们知道它将对计算产生革命性作用。

这是一个很宏远的目标,现在断言它是否能够完成目标还太早。

但是,它正在一步步地向此目标努力。

当人们讨论.NET时,无法确定他们正在讨论.NET的哪个部分。

Microsoft公司发行的其他“产品”或“思想”都不具有如此多的不同形式。

紧随.NET名字的是众多的产品、服务,甚至是概念,因此指出.NET实际上是什么,是非常困难的。

当本书中讨论.NET时,它指从.NETFrameworkSDK中可获得的新的开发语言和运行库。

该SDK包含.NET运行库。

而.NET运行库包含运行为.NET环境编写的应用程序所需要的所有东西。

可以认为.NET运行库由几部分组成。

CLR的部件驻留在GAC(GlobalAssemblyCache)中。

也包括Microsoft.NET语言的编译器(C#、VB.NET、VJ#等等)。

可以在图1-1中看到GAC。

图1-1 GAC

人们对运行.NET代码的最常见误解之一是,代码是“解释执行的”,像Java代码或者老的VisualBasic运行库一样。

事实上,为.NET编写的代码在执行前首先被编译。

当编译.NET应用程序时,它被编译为一种中间语言(IL,intermediarylanguage)。

这种IL实际上存储在可执行文件中或者已经创建的库中。

IL可能在两个位置中的某一处被编译为本机代码(nativecode)。

在安装代码时,可以执行一个称为ngen(nativegeneration,即本机生成器)的进程。

它将IL直接编译为本机代码,并将所编译的本机代码存储在GAC中的特定位置——本机程序集缓存(nativeassemblycache)中。

假设在安装时没有编译代码,则代码在第一次执行前必须被编译。

在应用程序启动期间,.NET运行库中一种称为JIT(JustInTime)编译器的特殊功能在后台执行编译工作。

在后一种情形中,因为发生在后台的编译工作,应用程序的启动时间将受到影响。

当启动时间对应用程序非常重要时(例如正在编写游戏时),确保在安装阶段包含ngen步骤是比较明智的。

但是,在这期间无法进行某些优化,而如果利用JIT编译代码,则可以进行这些优化,因此如果启动时间不是很重要,则可以让.NET运行库处理它所能够做的工作。

1.2什么是托管代码 

1.2 什么是托管代码

在本书中将经常提到托管代码。

在全书中使用的API被称为Managed的DirectX,.NET语言常被称为托管语言。

术语“托管”来源于.NET运行库具有一个内置的内存管理器这一事实。

在“过去”(只是几年前),使用C和C++编写代码的开发人员不得不自己进行内存管理。

当不再需要已分配的内存空间时,必须将其释放,除非希望该内存被“泄漏”,内存泄漏将带来严重的性能问题。

更糟糕的是因为直接处理指针,而它很容易破坏项目正在使用的内存。

在很多情况下,这将导致很长时间的故障调试,因为通常实际看到出错的地方并不是内存初始被破坏的地方。

人们认为C和C++语言难于掌握,主要是因为具有很多这种类型的问题。

许多开发人员不愿意尝试C和C++,也是因为这个原因,他们尝试使用其他没有这些令人头痛问题的高级语言,例如VisualBasic。

尽管这些新语言具有易用易学的优点,但也具有一些缺点。

它们的性能无法与C和C++语言相比,在大多数情况下显得特别慢。

另外,因为底层操作系统是使用C++开发的,所以这些语言难以实现C++的所有功能。

尽管可以使用它们处理很多非常好的工作,但是如果想要获得操作系统的所有性能和优势,只能依靠自己。

与.NET运行库的第一个版本相比,.NET的大多数内容都已经改变了。

Microsoft公司几乎完全重新设计了一种新的API,竭力确保开发人员关心的问题都会被解决。

这种新的运行库必须易学易用,快速高效,并且不存在令人头痛的内存管理问题。

在本书中,将看到.NET在这些方面的好处

1.3使用MicrosoftVisualStudio.NET2003IDE编写代码 

1.3 使用MicrosoftVisualStudio.NET2003IDE

   编写代码

提示:

本书设定在VisualStudio.NETIDE中编写代码。

这不是使用.NET编写游戏的需求,也不是使用.NET本身的需求,它是本书所选择的IDE。

图1-2显示了VisualStudio.NET2003IDE。

该IDE提供了编写.NET应用程序所需要的所有工具。

它不仅包括编写代码所需要的编辑器,而且还有其他大量功能,使得.NET应用程序的开发变得容易。

它的设计使得您能够方便地创建丰富的内容,如Windows应用程序。

它也具有一个内置的编译器和调试器,并且无缝集成了所有功能。

本书设定使用这种IDE进行开发。

图1-2 VisualStudio.NETIDE

熟悉这种IDE的最好方式是使用它编写一个简单应用程序。

典型的计算机编程是编写一个简单的HelloWorld应用程序,该应用程序只是在屏幕上输出HelloWord文本。

老实说,这非常令人厌烦,因此您应当尝试编写更复杂的程序。

但也不需要奇特的程序,因为这只是对IDE的一个介绍,当然在程序中包括一些用户特性交互将更好。

在这里将编写一个应用程序,询问用户的姓名和出生年份,然后输出用户的当前年龄。

1.3.1 C#代码

现在启动VisualStudio.NET2003IDE。

首次启动时,应当看到图1-2所示的默认启动页面。

单击该页中的NewProject按钮,启动一个新的项目。

如果没有显示这个页面,也可以单击File|NewProject菜单项,或者按下Ctrl+Shift+N快捷键。

这将产生一个NewProject对话框,如图1-3所示。

应当首先尝试C#代码,因此在NewProject对话框中,从左边的列表框中选择VisualC#Projects项,从右边的列表框中选择ConsoleApplication项。

为项目命名,然后单击OK按钮创建该项目。

这将创建一个新的控制台应用程序,当前它什么都不执行。

使用程序清单1.1中的代码替换自动生成的代码。

图1-3 NewProject对话框

程序清单1.1 简单的C#控制台应用程序

usingSystem;

classConsoleApp

{

staticvoidMain()

{

Console.Write("HelloWorldC#!

\r\nPleaseenteryourname:

");

stringname=Console.ReadLine();

Console.Write

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1