⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3d游戏编程入门经典.txt

📁 3D游戏编程入门经典.教你三天回3D、、3D游戏编程入门经典
💻 TXT
📖 第 1 页 / 共 5 页
字号:
3D游戏编程入门经典
无忧书籍网 www.51shuji.com

   如果熟悉了如何利用clr(公共语言运行库)编写代码后,在面临选择开发语言时,您可能已经知道了您的选择。在visual studio .net产品的最新版本中,当编写托管代码时,可以使用4种语言:c#、visual basic .net、managed c++和j#。此外还可以使用从visualstudio .net产品之外的第三方销售商处获得的其他语言,例如cobol或者fortran。

 尽管本书中将讨论的概念可以很容易地移植到任何完全兼容cls(通用语言规范)的语言,但实际的代码将仅包含所提到的前两种语言:即c#和visual basic. net。本书中将仅使用c#代码。您可以从http://www.tupwk.com.cn/downpage中下载本书配套的安装文件,获取相关代码。

 在本章中,您将学习到:

 ●       定义.net

 ●       托管代码

 ●       使用visual studio .net ide

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

 ●       开发人员

 ●       游戏开发过程

 ●       工具

 1.1  什么是.net?  自从microsoft公司宣布并发行.net之后,人们一直在尝试指出这种新“事物”到底是什么。根据microsoft公司的市场活动,人们知道它将对计算产生革命性作用。这是一个很宏远的目标,现在断言它是否能够完成目标还太早。但是,它正在一步步地向此目标努力。

 当人们讨论.net时,无法确定他们正在讨论.net的哪个部分。microsoft公司发行的其他“产品”或“思想”都不具有如此多的不同形式。紧随.net名字的是众多的产品、服务,甚至是概念,因此指出.net实际上是什么,是非常困难的。

 当本书中讨论.net时,它指从.net frameworksdk中可获得的新的开发语言和运行库。该sdk包含.net运行库。而.net运行库包含运行为.net环境编写的应用程序所需要的所有东西。可以认为.net运行库由几部分组成。clr的部件驻留在gac(global assembly cache)中。也包括microsoft .net语言的编译器(c#、vb .net、vj#等等)。可以在图1-1中看到gac。

  

 图1-1  gac

 人们对运行.net代码的最常见误解之一是,代码是“解释执行的”,像java代码或者老的visual basic运行库一样。事实上,为.net编写的代码在执行前首先被编译。当编译.net应用程序时,它被编译为一种中间语言(il,intermediary language)。这种il实际上存储在可执行文件中或者已经创建的库中。

 il可能在两个位置中的某一处被编译为本机代码(native code)。在安装代码时,可以执行一个称为ngen(native generation,即本机生成器)的进程。它将il直接编译为本机代码,并将所编译的本机代码存储在gac中的特定位置—— 本机程序集缓存(native assembly cache)中。假设在安装时没有编译代码,则代码在第一次执行前必须被编译。在应用程序启动期间,.net运行库中一种称为jit(just in time)编译器的特殊功能在后台执行编译工作。

 在后一种情形中,因为发生在后台的编译工作,应用程序的启动时间将受到影响。当启动时间对应用程序非常重要时(例如正在编写游戏时),确保在安装阶段包含ngen步骤是比较明智的。但是,在这期间无法进行某些优化,而如果利用jit编译代码,则可以进行这些优化,因此如果启动时间不是很重要,则可以让.net运行库处理它所能够做的工作。

  

         
   在本书中将经常提到托管代码。在全书中使用的api被称为managed的directx,.net语言常被称为托管语言。术语“托管”来源于.net运行库具有一个内置的内存管理器这一事实。

 在“过去”(只是几年前),使用c和c++编写代码的开发人员不得不自己进行内存管理。当不再需要已分配的内存空间时,必须将其释放,除非希望该内存被“泄漏”,内存泄漏将带来严重的性能问题。更糟糕的是因为直接处理指针,而它很容易破坏项目正在使用的内存。在很多情况下,这将导致很长时间的故障调试,因为通常实际看到出错的地方并不是内存初始被破坏的地方。

 人们认为c和c++语言难于掌握,主要是因为具有很多这种类型的问题。许多开发人员不愿意尝试c和c++,也是因为这个原因,他们尝试使用其他没有这些令人头痛问题的高级语言,例如visual basic。尽管这些新语言具有易用易学的优点,但也具有一些缺点。它们的性能无法与c和c++语言相比,在大多数情况下显得特别慢。另外,因为底层操作系统是使用c++开发的,所以这些语言难以实现c++的所有功能。尽管可以使用它们处理很多非常好的工作,但是如果想要获得操作系统的所有性能和优势,只能依靠自己。

 与.net运行库的第一个版本相比,.net的大多数内容都已经改变了。microsoft公司几乎完全重新设计了一种新的api,竭力确保开发人员关心的问题都会被解决。这种新的运行库必须易学易用,快速高效,并且不存在令人头痛的内存管理问题。在本书中,将看到.net在这些方面的好处。

  

         
   提示:

 本书设定在visual studio .net ide中编写代码。这不是使用.net编写游戏的需求,也不是使用.net本身的需求,它是本书所选择的ide。图1-2显示了visual studio .net 2003 ide。

 该ide提供了编写.net应用程序所需要的所有工具。它不仅包括编写代码所需要的编辑器,而且还有其他大量功能,使得.net应用程序的开发变得容易。它的设计使得您能够方便地创建丰富的内容,如windows应用程序。它也具有一个内置的编译器和调试器,并且无缝集成了所有功能。本书设定使用这种ide进行开发。

  

 图1-2  visual studio .net ide

 熟悉这种ide的最好方式是使用它编写一个简单应用程序。典型的计算机编程是编写一个简单的hello world应用程序,该应用程序只是在屏幕上输出hello word文本。老实说,这非常令人厌烦,因此您应当尝试编写更复杂的程序。但也不需要奇特的程序,因为这只是对ide的一个介绍,当然在程序中包括一些用户特**互将更好。在这里将编写一个应用程序,询问用户的姓名和出生年份,然后输出用户的当前年龄。

 1.3.1  c#代码  现在启动visual studio .net 2003 ide。首次启动时,应当看到图1-2所示的默认启动页面。单击该页中的new project按钮,启动一个新的项目。如果没有显示这个页面,也可以单击file | new project菜单项,或者按下ctrl+shift+n快捷键。这将产生一个new project对话框,如图1-3所示。

 应当首先尝试c#代码,因此在new project对话框中,从左边的列表框中选择visual c# projects项,从右边的列表框中选择console application项。为项目命名,然后单击ok按钮创建该项目。这将创建一个新的控制台应用程序,当前它什么都不执行。使用程序清单1.1中的代码替换自动生成的代码。

  

 图1-3  new project对话框

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

 using system;

 class consoleapp

 {

 static void main()

 {

 console.write("hello world c#!\r\nplease enter your name:");

 string name = console.readline();

 console.write("hello {0}, please enter the year you were born:", name);

 int year = int.maxvalue;

 while(year == int.maxvalue)

 {

 try

 {

 year = int.parse(console.readline());

 }

 catch (formatexception)

 {

 console.write("you did not enter a valid number. ");

 console.writeline("please enter an integer, such as 1975. ");

 }

 }

 console.writeline("you must be approximately {0} years old! ",

 datetime.now.year-year);

 console.writeline("press the   key to exit the application");

 console.read();

 }

 }

 如果您已经熟悉了c、c++或者java,则c#语言的语法与这些语言非常相似。尽管c#的底层运行库仍然是clr,但是它的语法源于这些语言,熟悉它们的开发人员很容易进行移植。该代码根本不复杂,它在询问用户的姓名和出生年份之前,首先使用console类输出一个简单的消息(该消息包含hello world)。注意,该应用程序接着询问出生的年份,直到用户输入一个有效的数值。它最后利用一个简单的公式输出用户的当前年龄。图1-4显示了该应用程序的运行过程。

  

 图1-4  第一个应用程序

 1.3.2  vb .net代码  如果读者更熟悉visual basic语法,很可能能够理解前文中的大多数代码。这两种语言的语法差别不是很大,但还是应当尝试编写一个visual basic .net版本的应用程序。再次启动一个新的项目,并采用在c#代码中所使用的相同指令,其中不同之处是项目的类型。应当选择visual basic projects项目,创建该项目后,使用程序清单1.2中的代码替换自动生成的代码。

 程序清单1.2  简单的vb .net控制台应用程序

 module module1

 sub main()

 console.write("hello world c#!" + vbcr + vblf + "please enter your 

 name:")

 dim name as string = console.readline()

 console.write("hello {0}, please enter the year you were born:", name)

 dim year as integer = integer.maxvalue

 while year = integer.maxvalue

 try

 year = integer.parse(console.readline())

 catch fe as formatexception

 console.write("you did not enter a valid number. ")

 console.writeline("please enter an integer, such as 1975. ") 

 end try

 end while

 console.writeline("you must be approximately {0} years old! ",

           datetime.now.year - year)

 console.writeline("press the   key to exit the application")

 console.read()

 end sub ‘main

 end module ‘ module1

 如您所见,从c#到vb .net的代码移植并不复杂。因为这两种语言运行于相同的运行库之上,所以这两段代码仅存在微小的语法差别。也应当注意到,这两段代码产生了相同的结果。这是.net的一种强大功能,它允许开发人员使用他最熟悉的语言编写代码。如果使用了编程语言x,您不必担心不能利用编程语言z中的功能y。因为每一种托管语言使用了相同的底层运行库,它们都具有相似的功能集。

  

         
   到目前为止,使用visual studio .net ide是开发.net应用程序最容易的方法,但它并不是仅有的方法。.net运行库将c#、vb .net和vj#的编译器随其运行库一起发布,因此只要有一个文本编译器和.net运行库,就能够创建任何.net应用程序。

 提示:

 为了实际开发并使用.net应用程序,需要.net运行库。如果没有安装,您可以从microsoft的网站http://www.microsoft.com/net处下载。

 打开一个文本编辑器(例如notepad),输入前面某一个程序清单中的代码。保存该代码,并打开一个命令提示符。在使用.net运行库中的编译器之前,需要设置路径,将其指向底层.net framework的位置。在命令窗口中,输入下面的命令更新路径:

 set path=%path%;c:\windows\microsoft.net\framework\v1.1.4322

 警告:

 如果windows文件夹不是在c:\windows处,当更新路径变量时,确保输入了正确的windows文件夹位置。

 命令行编译器位于上文所列出的文件夹中,与一些组成.net运行库本身的程序集相同。c#的编译器是csc.exe,vb .net的编译器是vbc.exe。这些可执行文件具有相似的命令行参数集,可以使用单个参数/?来显示这些编译器的所有参数。

 假设使用了该代码的c#版本,并将文件保存为class1.cs,可以利用如下命令将应用程序编译为名为app.exe的可执行程序。首先定位到代码文件所在的文件夹,然后运行下面的命令:

 csc /out:app.exe /target:exe class1.cs

 输出应当类似于下面的内容:

 microsoft (r) visual c# .net compiler version 7.10.3052.4

 for microsoft (r) .net framework version 1.1.4322

 copyright (c) microsoft corporation 2001-2002. all rights reserved.

 现在运行该应用程序,它将产生与使用ide作为开发环境时相同的结果。

  

         
  在2001年,视频游戏的收入首次超过了电影工业的票房收入。该产业欣欣向荣,并需大量优秀的开发人员。如果一个公司能够在某个顶级游戏中花费上百万美元,那他们很自然地会对游戏开发团队非常挑剔。本章将讨论游戏开发的过程和制作这些伟大游戏的团队。  

         
   在最近几年中,作为directx组的一员,我非常高兴能够与大量的游戏开发人员一起讨论问题。尽管每一个开发人员都是独特的,但是他们具有相似的特征。其中最显然的特征之一是他们都绝对喜爱游戏。当然,这是可以预料的。游戏开发是一项艰苦的工作,它时间长、任务紧,压力大。那些不具有献身游戏精神的人应当去编写没有这些压力的软件。

 尽管目前对于一个游戏工作室来说,宣布在开发游戏中的花费是不常见的,但是许多游戏在开发期间花费了上百万美元,这是公司发行游戏的真实投资。许多游戏需要多年的开发,这需要对游戏本身和开发人员、艺术家、设计人员以及任何参与制作的人员具有绝对的信心。很多时候,发行商屈服于压力,并在游戏准备好之前就发行。另外一种情形就像duke nukem forever(3d realms所发行的一款游戏)该游戏的开发时间超过了5年,发行商直到它最终完成才发行。

 回到视频游戏开发的早期(古老的拱廊和atari家庭系统),游戏通常由一个或两个人编写,编写时间是几周而不是几年。由此可以看到当今的视频游戏世界的巨大进步。回到那时您可以制作一个非常简单的游戏,例如galaga,它只有一个级别,玩家只能反复地在该级别中进行游戏。它的图形简单,但非常有趣并且令人着迷。它的编写困难吗?任何曾经看到该游戏的开发人员应当认识到它非常容易编写。

 相反,当今的游戏功能非常巨大,必须设计、开发庞大的世界,并且创建一些艺术资产。大多数游戏包含多个级别和非常复杂的玩法,而不是早期游戏中所看到的向前向后移动并开火。所有这些先进的特性需要越来越多的开发时间,并且由于当今游戏玩家期望这些先进的特征,所以任何大预算的项目似乎都不可能在短短的几周内完成。

 当今的大游戏也对游戏开发人员的繁荣添加了一层复杂性,因为捕获大众注意的游戏不再可能由个人完成。实际上个人(甚至是一个小组)也不可能将所编写的游戏放到货架上出售,因为计算机软件商店销售游戏的开销是非常高的。

 大多数游戏开发初学者将他们编写的游戏作为共享软件发行,甚至是免费软件。有大量的网站为共享游戏开发作贡献,该团体由其他许多游戏开发人员组成,他们提供有价值的反馈、测试和论坛,在论坛中可以展示新思想以及炫耀您的最新创作。初学的游戏开发人员不可能通过创建这些小的共享游戏变得富有,但却使得他们能够开发重要的“样片(demo reel)”,在大预算项目中申请一个游戏开发位置时,可以使用这些样片。

 正如引言中提到的一样,本书将引导您学习开发一个高性能、完全3d的游戏所需要的技能,使得您在某一天能够开发自己的样片。在这之前,您需要询问自己:准备好成为一个游戏开发人员了吗?并询问自己以下几个问题:

 ●       您喜欢玩视频游戏吗?

 ●       您是否曾经沉迷于游戏而忘记了时间?

 ●       您常常在思考这些世界是如何创建的吗?

 ●       您是否相信自己具有能够转换为下一个伟大视频游戏的构想?

 ●       您对当今存在的所有相同的老游戏感到厌烦了吗?您有关于重新定义流行视频游戏的构想吗?

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -