赞助广告

 

年份

最新评论

评论 RSS

创建你的第一个游戏Pong——游戏构思

clock 七月 26, 2010 14:45 by author alex
游戏构思 对于一个像Pong的游戏,讨论游戏内容似乎有点儿可笑,但是我试着尽可能保持事物的常规。在你开始编码前,考虑游戏应该看上去怎样和玩起来感觉怎样是重要的。越大的游戏项目,设计阶段越是重要。我不是说没有任何概念你就不可以写游戏或者应用程序。实际上,大多数初学者都是以写东西开始,然后再一遍遍地改进直到它看起来非常好。问题在于,要在第一次尝试的时候就找到最好的解决方案是几乎不可能的。 Pong游戏逻辑非常简单,也不需要太多的文字内容或者图像(如图2-1所示)。这使得编写代码和游戏构思都很简单。只要考虑该游戏需要的所有组件(比如球、球拍和屏幕边框等)以及你的最初想法。 图 2-1 写下你的创意 写下创意概念并不意味着你必须疯狂地写下所有想法、画UML图,直到所有东西都计划好了才开始工作。我完全反对这种方式,因为您不可能把一切东西都想到。另外,初学者很可能不知道如何以最好的方式预先设计整个游戏。取而代之,可能在您的脑海中对您的游戏有一个非常清晰的画面,并且当您在脑海中花了足够多的时间来设计之后,你就可以开工了。 如果在您的游戏项目中还有其他人一起工作,那么解释游戏构思以及让其保持每个人思想上的同步将变得比较困难。仅仅因为这个原因您就应该养成一个习惯,只用一页纸写下您的游戏构思。 您不但可以把这个展示给其他人看,也可以书写更多内容,但是您还得考虑其他的东西——当你书写游戏构思的某个部分时,你会看到纸上的东西比脑海中想的更加复杂,而且您不得不考虑额外的从属物。 例如,在Pong游戏中,您知道您需要两个球拍和一个球,该球在球拍之间运动。但或许只有当您写下最初的构思以及考虑到精灵的纹理之后,您才会想到更多的游戏细节。 每个玩家有几条命?怎样检测球碰到了球拍的边缘,以及如何处理它?球拍的速度会影响球的速度和运动方向吗?当两边玩家都觉得无聊的时候,是不是要每隔一段时间就增加游戏的速度呢?当然,当您完成第一个游戏版本之后,许多方面都可以改进。但是,在您开始编写复杂的代码之前把所有这些都加入考虑会让事情容易得多,而且后来你会发现你甚至不需要这么做。 作为一个例子,我会写下您将在本章中开发的Pong游戏的设计构思。您可能想花5到10页的篇幅来写更加复杂的游戏,但是不要一行代码都没有写就写了100页的构思文本。这会花太多时间而且很难管理这些构思。使用“敏捷方法学”您将经常更新想法并修改一些细节,我一般都是在代码至少完成了50%之后才开始画UML图,而概览图和文档直到项目快结束的时候才进行更新。 游戏构思:Pong 这个游戏是一个简单的Pong游戏克隆版,它支持一或二个玩家。在单人模式中,计算机会控制另一个球拍。在多人模式中,两个玩家既可以使用游戏手柄玩,也可以在PC上使用同一个键盘的不同按键来操作,还可以在Xbox 360控制台上玩。 游戏会为球和球拍使用一些2D图片,以及一些声音文件来支持当球撞到球拍或者丢了一条命的特效。还有一个非常简单的菜单允许你如下选择: 单人模式 多人模式 退出 菜单使用一个简单的纹理图片,背景就是一块黑暗空间,而大多数的图片是明亮的。您要试着把游戏尽可能做得有趣。 游戏特点及玩法 游戏有两个屏幕模式:菜单Menu和游戏Game。菜单就是之前提到过的,包含几个菜单条目,游戏主要由球、两个球拍以及一个简单的计分系统组成。看一下这张简单的草图,您将试着完成的任务(图2-2): 图 2-2 技术 很明显,您将使用XNA Game Studio Express;不需要使用其它的额外类库,因为你只是渲染一些简单的sprite精灵,这里也不涉及3D模型或者Shaders。游戏应该在Windows平台和Xbox 360控制台上都可以运行。 如您所见,我设法将所有东西都放到一页纸的篇幅内,这是我在写游戏构思时候的一条规则:首先把所有东西都放在一页篇幅内,然后写一些代码,如果您的团队或者外部合作伙伴(比如,如果您想展示概念给一个游戏出版商)需要的话,可以写一份5-10页的白皮书,包含一些最初的想法和草图。 我从来不会在游戏构思的阶段谈论编码,我只要确定将使用什么技术。现在是时候考虑执行的问题了。不要在你写游戏构思的时候考虑您的实际能力,因为这会限制您太多。把它们抛之脑后吧。 有关游戏构思的一个更完整的例子是Rocket Commander的构思(参见图2-3)。您可以查看本章文件夹中的相关PDF文件。它包含4页篇幅和一个封面,它描绘了Rocket Commander的所有构想。就想您从封面看到的,游戏看起来和它的构思非常不同,但是大体上的游戏想法都体现出来了。 图 2-3 敏捷方法学 对软件开发来说,敏捷方法学是个概念框架。其基本思想是避免大的计划阶段,因为这经常会带来危险的和不切实际的项目进度表,以至于难以遵从。对于较小的项目,您可能只要短时间的反反复复,但随着项目的增大,您可能会发现你总是把自己放在问题的面前,而这些问题可能要花费几个月甚至几年才能解决,并且这些是很难计划到的。 取代把所有东西都规划到最细节的水准,只要一些粗略的构思就可以了。在整个敏捷开发过程中,构思的每个部分被逐步细节化的反复多次,在单元测试的帮助下设计代码,然后编写实际的代码来实现,最后测试并写该部分的文档。这样的反复应该不会超过几个星期,而且大项目的所有部分都会重复这样的过程。 敏捷方法还包含其它的一些思想,关于让开发人员和客户、测试人员、项目管理人员以及设计人员等,更好地在一起协作。有几条规则可以用到敏捷框架中来避免整体的混乱。因为被缩短了的设计阶段,看起来好像没有为项目进行详细的计划,和混乱的强力编码相类似。但实际上,设计过程贯穿于更个项目,并且比在开始就设计好一切,并且不得不忍受在那个为整个项目计划阶段所产生的所有错误,要更有用得多。 我不会在本书中过多地讨论敏捷方法学,不过我首先会使用单元测试以及简略的概念,单元测试设计,然后反复地编码将贯穿本书的所有项目。如果您想了解单元测试的更多信息,我推荐您访问Martin Fowler的站点http://martinfowler.com 。 Martin也写了好几本书,并且我推荐《重构:改善既有代码的设计》(Refactoring: Improving the Design of Existing Code)这本书。您也可以在网站上找到它。您还可以在他的站点上找到更多的有关敏捷软件开发过程的链接及信息。 解决最初的困难 好了,游戏的构思您已经有了,但您还没有花时间在得到图片和声音文件上,以及如何实现它们。球撞击球拍边缘的问题又如何处理呢?您是否需要为球而设计一个简单的物理引擎呢? 在设计阶段之后,所有这些问题都会冒出来,而对于更复杂的项目来说,可能要花几个星期甚至几个月的时间来解决一些基本问题。比如,我做的第一个.Net 2.0游戏Rocket Commander,我有一个美好的想法就是在屏幕上显示上千颗小行星,并且总体上有数百万个。我有一个很酷的想法是让它们相互碰撞并反弹,但如何最优化地实现它并不是很清楚。在最初的测试之后,我发现,我甚至不能在没有明显降低性能的前提下渲染超过100个小行星。此时,我并没有重写我的游戏构思,也没有做一个根本没有几颗小行星,令人厌烦的游戏(如果没有很多小行星那它就不是一个真正的游戏——这就是Rocket Commander的游戏原则),而是试着通过把小行星按照Shaders和材质设置(Material Settings)分类,然后渲染它们来解决这个问题。如果小行星不可见,就尽早把它们清空,并且只把物理过程的处理应用于相邻的小行星上。 虽然经过一周的工作和最优化处理,直到小行星能以不错的执行效能渲染出来,但是物理过程的处理仍然太慢了。即使应用了最好的优化处理,只是在每一帧的可视范围内更新5,000到10,000个小行星来看,它们相互碰撞仍然显得太多。我依然想让小行星相互撞击,并且在碰撞后运行正常。如果每一帧我只检查某一数量的小行星,算法经常会错过碰撞,而且只捕获到当2个小行星都已经彼此渗透的时候。带来的麻烦甚至比完全移除物理过程还多。我几乎快要放弃了,因为我已经花了整个项目的50%的时间来解决这一个问题。但后来我又有了一个想法,把整个空间分割成若干个区域。每个区域都有特定数量的小行星,每当一个小行星离开一个区域的时候就把它从这个区域移除,并添加到新的区域。这样小行星只需要检测它们自己的以及所有邻近区域的碰撞,这听起来好像还有很多碰撞检测,但是使用区域逻辑(sector logic)的确把物理过程的性能提高了100倍之多,并且经过优化处理后还会更多。 在我现在参与的大多数游戏项目中,我会花一半还多的时间来解决最初的问题,并且把它们分化成较小的问题,这些问题再次被解决。 稍后,通过把这些小的碎片一起正确放置,游戏自身被组合起来,大约几天时间,就像变魔法,整个游戏完成了。 虽然这可能是尽可能快的方式来完成一个游戏,但是很长一段时间看不到游戏运行的结果会有一种挫败感。在过去,我总是反复地修改游戏,直到我对结果满意为止。这也的确会花很长时间。多亏了敏捷开发过程,现在我可以解决这些问题并且再也不用反复几乎没有止境的改进循环了。 这对您的Pong游戏意味着什么呢?好了,游戏非常简单,并且您不需要花很多时间对它改进100次,不过说起来你只要实现一个基础版本的Pong,为计算机硬编码(hard-coded)一个球拍,在左边随着球的位置上下移动,并且要控制右边的球拍。 经过改进和测试单人模式的游戏之后,您或许想添加双人对战的支持,但这非常难,因为您硬编码了。您可能会把这部分代码注释掉,或者甚至删除之,并重新构造游戏玩法的代码。后来测试了双人对战模式之后,您可能又想添加一个菜单,并且您又再一次调整代码位置,重新实现游戏编码等等。 虽然所有这些是一个好的实践方式,并且迫使您不断地重构您的代码(重构的意思是在不改变功能的前提下,修改代码层,使之容易维护;参看Martin Fowler的书,Refactoring),每次只聚焦在游戏的一个部分上,并且使用几个版本并行测试会容易得多。在本章接下来的部分,您将要这么做,并且希望您能领会我的意思。归功于单元测试,代码重构会更自然,并让您的代码更易使用,还能让您更快地看到运行结果。 接下来的部分,您要解决的问题之一是如何处理球的物理运动,以及如何检测撞击了球拍的哪个部位。 创建纹理 在您开始编码之前,您需要一些纹理显示在屏幕上。即使在这里您使用虚拟位图(dummy bitmap),或者一些从其他地方得到的图片,考虑最终的图像还是很重要的,比如球和球拍的尺寸等等诸如此类的东西。 再说一次,您的Pong游戏相当地简单,但更加复杂的游戏可能需要一个美术创意、很多草图以及一个能管理这些艺术作品并能及时地完成它们,以便于游戏编程人员实现它们的人。回顾计算机游戏早期,几乎所有的游戏都是靠一个人单独完成的,虽然这是最容易的方式,但今天没有一个正规的游戏可以只靠一个人来开发。大多数优秀的艺术设计师都不是编程人员,并且大多数编程人员也不是好的艺术设计师。如果您只做一个简单的游戏这样倒无所谓,但是您的项目变得越大,您就需要更多的时间来找合作伙伴、熟练的的艺术设计师和模型制作人员,并且组织这一切。 看一下游戏图片(见图2-4), 图 2-4 您将用到三个纹理文件:(1)SpaceBackground.dds 作为背景;(2)PongMenu.png,它包含了Logo,菜单项以及游戏需要的其他文本;最后是(3)PongGame.png,用于球拍和球。另外,你将导入两个声音文件(PongBallHit.wav和PongBallLost.wav)到项目中,并添加一个简单的XACT工程项目来播放声音。要学习更多关于声音和XACT的内容,请阅读第九章。

创建你的第一个游戏Pong——概览

clock 七月 26, 2010 14:37 by author alex
  第2章:创建你的第一个游戏Pong 概览 这个章节讨论了设计和创建一个简单的Pong游戏。Pong曾经是第一个视频游戏,甚至在六十年代第一批Pong版本出现以前,就有一个能在示波镜oscilloscope上玩(2人网球,William A. Higinbotham,1958)的版本。这说明了实现一个基础版本的Pong有多么容易。一个叫做Ralph Baer 的TV工程师声称甚至早在1951年他就有实现Pong的想法,但是直到1966年他才出示了第一个原型。Atari在80年代得到Pong的授权许可,并且和另一个公司打了一场官司,该公司声明他们是第一个发明Pong的。如果你今天听到是为了这么简单的一个游戏而打官司简直是疯了。你能在www.pong-story.com,阅读到完整的Pong的故事。 实现一个非常简单的Pong的克隆不会花太多的时间,不过你也得学习本章关于XNA的Sprite相关类。你将从写游戏构思开始,然后经历一个完整的游戏项目设计阶段。在将来的工程项目中,你可以有同样的选择,不久之后,您再先不必首先撰写游戏构思的过程,因为在做第一次单元测试的时候您就已经能很自然地产生这些想法了。然后,您将学习一种有效的方法来管理和使用游戏的纹理,并修改调整您的游戏,让它更加有趣,加入双人对战的支持,甚至在Xbox 360控制台上测试。 虽然本章聚焦在Pong游戏,但这并不是您将要唯一学习的,Pong游戏更多的是用来学习我将在本章稍后提及的“敏捷方法学(Agile Methodology)”的。您将学习为什么首先写单元测试很重要,并且预先设计游戏,然后再一步一步地改进它。在接下来的几章中您也将针对其他的一些类来使用单元测试。对于这个游戏,您只需要一个简单的类,然后在末尾添加几个单元测试来测试绘图、碰撞和正确地定位每一样东西。 这一章使用的单元测试的种类归诸于静态单元测试(static unit tests),相应的在下一章中您将学习动态单元测试(dynamic unit tests)。其区别在于您要手动启动静态单元测试,并且要亲自根据屏幕的输出结果来检查是否正确。动态单元测试则是在一个单元测试框架,比如NUnit的帮助下自动执行。更多有关单元测试框架(Unit Testing Framework)的细节,参阅第三章。

XNA框架基础——总结

clock 七月 21, 2010 09:18 by author alex
总结 本章涵盖了许多XNA背景知识,以及如何让XNA Game Studio Express在您的PC上正常工作,还介绍了如果你有Xbox 360,如何给它安装XNA。您还创建了自己的第一个小项目——我并不把它叫做一个真正的游戏,不过它使用了texture,处理了Xbox 360控制器输入和键盘输入,并且通过背景纹理的上下滚动,你和屏幕有了一个交互。 接下来的几章将聚焦于编写很酷的小游戏。这里概述的是至今为止你所学到的: XNA Framework背景知识 安装XNA Game Studio Express 如何在Visual Studio 2005上运行XNA的提示和技巧 介绍了一些可能有用的附加工具,比如TestDriven.Net,SourceSafe以及Ants Profiler 编写您的第一个XNA项目 应用程序模型的概念,以及Initialize,Update和Draw方法 清空背景 借助SpriteBatch绘制texture 处理GamePad和键盘输入 根据输入绘制一个平铺的背景

XNA框架基础——疑难解答

clock 七月 21, 2010 09:15 by author alex
疑难解答 现在你已经阅读了你需要知道的如何起步第一个XNA工程项目。如果你只是通读这一章节,我强烈建议你至少打开这一章节的工程项目(从 www.wiley.com下载)并且运行之。 如果你遇到安装DirectX,.NET 2.0,或者XNA的问题,试着查找XNA论坛,也就是http://msdn.microsoft.com/xna/forums的帮助。由于有很多错误会发生,所以在书中的表格中得到提示很难。通常,确保你是最小化需求。例如,如果你试着安装一个不被支持的平台,并且不可以解决,试着查找帮助在Internet,或者转换到一个被支持的平台。 因为.Net 2.0对于你操作系统的大多数最近的service pack包都很重要。DirectX确定你有最新的图形驱动程序,并且有一个像样的图形卡来工作在3D图像,最后至于XNA,确定你再启动XNA Setup前正确安装了一切。 让XNA在windows上工作并不很难。在Xbox 360许多运行问题会出错。这里有一系列提示来确保你在XBox 360上运行游戏的必要条件。 在你的XBox 360上需要一个Xbox 360 Live 账号,它必须在所有你开发和测试XNA游戏的时间被连接。 确定你的PC和XBox 360在相同的网络,他们能彼此“看见”。你能测试pinging从你的PC到XBox 360 IP,或者连接你的PC作为来自于XBox 360的媒体中心。 如果Xbox 360 XNA Framework 不能被安装,在Internet查找更多帮助,来看你的Xbox 360是否遇到最小需求(例如,你需要一个硬盘)。 当你在设置XNA Game Launcher 创建了一个密钥,并且不被你的PC接受,因为你可能打错了,或者它包含0(数字)和字母O。它几乎看起来一样,只要再试一次;你总是可以创建一个密钥。看本章节先前的细节。 如果XNA Game Launcher 不能启动,并且按钮显出灰色或者你收到一些错误像0xffffffff,它意味着你的profile没有被连接到Xbox Live 或者有某些错误设置。如果以前安装过旧版本的XNA Framework,卸载它,删除你的profile,并且创建一个新的profile和再次重新安装XNA Framework。 第二章讨论了更多关于每一步必需的为了得到运行在Xbox 360的游戏,但是这一章节 也只工作在XBOX外面的控制台细节。就像启动工程,转换到 Xbox 360 输出,并且按F5。如果你已经正确安装了一切,你能看到在 Xbox 360 有同样的输出。祝贺你!你刚刚步入你的第一个 Xbox 360 游戏。 如果你遇到编译错误来自于本章的代码,这里有最后的提示: 确定你有完全的变量定义:graphics,content,backgroundTexture,sprites,和scrollingPosition。 阅读编译器的错误信息并且因此改变代码。也许你试着使用一些陈旧的方法;要么用新方法替换,要么就注释掉它,来看看余下代码如何运转。 如果编译工作正常,但是程序失败或者抛出异常,它很像你缺少了某些内容文件(如工程项目里的CityGroundSmall.jpg纹理 )或者你的显卡不支持最低的Shader Model 1.1。

XNA框架基础——XNA的注意事项

clock 七月 21, 2010 09:12 by author alex
XNA的注意事项 为了完成这一个章节,这里有另外一些关于XNA 框架 和XNA Game Studio Express的技巧和窍门。如你所见,你知识能够开始编码和顺利工作,但是当你运行遇到问题,或者不知道如何解决一个特定的问题,依赖于浏览器的一个个书签总是有好处的。 另外,这一个章节部分讨论了.NET和 C# 的一些优点,而且检验XNA与Managed DirectX之间的不同。 重要的超链接 只是一些给你书签的链接。 http://msdn.microsoft.com/directx/xna/ - 在微软MSDN上的XNA开发者中心页与XNA Game Studio 和XNA 框架论坛,它是你在Internet上发现的最活跃的XNA 论坛。在这里,你也能下载最近的XNA 版本。阅读FAQ,并且看更新的内容。 http://en.wikipedia.org/wiki/Microsoft_XNA -进入Wikipedia关于 XNA,经常更新并且包含许多其他主题的链接。网页底部有一些有用的外部链接被罗列。 http://xnadevelopment.com - 好的新站点,有大量的链接、指南和让你开始在XNA 世界的技巧。 http://xnaresources.com -另外一个新站点,有大量的新闻,和一些实在有用的瓷片引擎指南。也包含许多你可能喜欢的游戏组件。 http://learnxna.com - 博客形式的XNA新闻网站, 也包含一些视频教程,并且聚焦在学习XNA和图形工具的技巧和窍门。 http://abi.exdream.com - 作者的官方网站。在这里,你能找我做的更多游戏,连同Rocket Commander XNA,XNA Shooter,或来自于本书的竞速游戏,和所有文档和我为此而制作的视频指南。另外,我建议检验Rocket Commander视频指南,它在Coding4Fun相当流行。 C#有利于开发游戏吗? 像www.GameDev.net那样的网站,不断有论坛贯穿讨论C++和C#之间的差别。通常在一些回复之后,它们都终结于一个无意识的语言战争。回到.Net早期(2002)我讨论过相当多的这些思路, 但是当99.9% 的程序员站在C++一边那就太郁闷的了,而且没有办法使人信服,因为他们甚至不真诚对你。不计主观感觉的好恶,语言战争不真正的把C#当作一门语言,因为JAVA做为游戏编程平台是失败的,除了蜂窝电话游戏以外。因为JAVA和C# 都是托管的语言,并且看起来非常相似。但是如果你考虑到同样的战争发生在C取代汇编语言,C++取代C的日子。甚至今天,C++被Bjarne Stroustrup开发了20多年之后,一些游戏程序员仍然使用C,并不完全得益于C++。即使你看一看流行游戏引擎的源代码,像Quake 或者Half-Life,看上去更像C而不是C++。 在游戏编程世界真是奇怪;每个人害怕经由转到一种新的语言,失去太多的执行效能,并且另外也可能失去他们的旧密码基础或者将它转换到一种新的语言有大量的工作。然而,游戏程序员很快采用新技术和脚本语言,而且总是在最新的硬件发展上。甚至在Shader Model 4显卡可被获得的一年以前,我们游戏开发者就得到了DirectX 10。 在2001年底,在检验早期的beta版之后,我很快地就在2002年初就采用了.Net和C#。我正好开始了一个新游戏引擎,并且我们团队有一个想做的工程项目。绝对没有图形引擎或者任何别的,除了一些简单的.Net早年的2D游戏。直接在C#上使用OpenGL和DirectX非常难。它需要大量调用非托管的dll,并且卷入大量讨厌的指针逻辑,它是C#中唯一可利用的非安全代码。在2003年,微软最终发布了Managed DirectX的第一个beta,它使得相当容易地在.NET中,编写新DirectX应用程序成为了可能。使用Managed DirectX取代本地DirectX dll被证实只有1%-2%的执行效能损失,这真的不重要。然而,这不意味着游戏开发者正在跳上C#;每个人仍然非常怀疑,并且甚至在我发布第一个商业性的.Net游戏之后。,即2004年的Arena Wars,它花了又一年,直到越来越多的开发者最终给予.NET又一次机会。学生和初学者尤其真的感谢C# 的简单,以及越来越多的人开始.NET开发游戏。C++ vs C# 的讨论依然存在,而且讨论点仍旧时同一个,但是其结果现在平衡得多(我停止看任何有“vs”名称的主题很长时间了;一而再地阅读相同的争论仅仅是浪费时间)。 总是记得你会陷入一些家伙之中,他们可能告诉你 C++ 是长者而且 C# 只是给新手。相同的事发生在汇编语言和几年前的C++之间,并且未来有使我们的生活变得更容易的新的语言,而且仍然立刻有人迟疑犹豫采用它们。大多数的大型game studios 也不会立刻采用每一个新技术;它们可能是在一些大的工程项目中间,并且他们也有非常大的代码基地,移植它可不容易。可是,长时间运行之后,代码将会转换,并且我们将进阶到高层次语言。 图 1-15是一张我做的老图片显示使用C++ 的DirectX 和使用C# 的Managed DirectX的区别。如你所见, MDX代码是非托管代码的几乎一半长。对于XNA来说可能更短,而且更容易载入纹理并在屏幕上显示, 但与MDX作比较是困难的,因为概念不一样。 图 1-15 慢慢熟悉内容管道 当你看到你先前的第一个XNA 工程项目,它相当容易到,只要拖拽和放下一个纹理到XNA Studio里的游戏工程项目。虽然所有的游戏内容放在一个地方并且直接与代码文件并排很好。有一些事物你必须记得。在我的生活中所见的大部分工程项目,不是直接把纹理、模型、或shader直接放Visual Studio 工程项目。 这样做的的理由是事实上,很非常容易到仅仅拷贝了一些新文件在上面,然后让游戏直接地加载它们。Visual Studio 默认也是不拷贝任何内容文件到你的输出目录;你必须从None to Content改变 Build Action ,并且设置如果有新内容,就Copy 到输出目录。这是一个相当大的麻烦,而XNA 使它稍微化简了。 你可能甚至会问为什么改变你以前加载纹理的方法呢?如果你仅仅想要你的游戏运行在windows平台上,你当然可以加载纹理和动态阴影,并且在它们第一次当做 XNA 内容文件进入你的工程项目时不导入。在游戏的时候,能改变纹理和动态阴影是有利的(一个不被XNA 内容管道支持的特色)。可是,因为没有其他加载方法来自于ContentManager类,该类只加载编译过的.xnb 内容文件,模型文件不工作。 在Xbox 360上你只能加载内容文件;不支持直接地加载纹理和阴影。 如果你使用直接的纹理或加载阴影,肯定你会不容于Xbox 360 平台代码;Xbox 的dll不支持加载任何内容文件以外的一切。 更多细节有关重要的模型文件,阅读这书第2部份的章节。这一个主题不像使用纹理一样容易。因为这一个部分坚持于精灵和2D纹理,而且使事物保持简单。因为简单的2D游戏,它很好很容易,但是写一个认真的游戏。你将需要3D模型和许多酷的阴影(shader)效果。 我也建议你找一个艺术家为你做纹理和3D模型。 它是一个相当复杂的主题,并且亲自做所有的事可能浪费许多时间。其他人也可能更擅长做纹理和3D模型;利用你的编码技能,而且让其他人做美工。如果你没有任何的艺术家可用,试着使用来自于本书和XNA starter kit的一些模型和纹理来开始吧。 和MDX的不同处 如果你来自于MDX (Managed DirectX) 并且想移植游戏到 XNA 框架,有一个很棒的向导在http://msdn.microsoft.com/directx/xna/migration/.XNA的官方主页。 你能在XNA文档中找到相同的帮忙。在这里,我不想重复所有的,但是基本上你必须记得XNA 使用右手系矩阵而MDX 默认是左手系。也有一些新的类和结构体来确保你不再需要 Windows.Forms 命名空间。因为不再支持固定功能管道,Windows Forms 旧的工作方法、句柄、以及支持旧PC配置的考虑不再必要了。图形和阴影(shaders)被本书的第二部分讨论。 另外的工具和提示技巧 另外,你应该看一看XNA文档的Getting Started帮助主题,XNA Studio Help --〉 Contents --〉 XNA Game Studio Express。 你能找到更多信息,关于Xbox 360的连接、编写你的第一个工程项目,以及有关所有的starter kit。io Express。 你能找到更多信息,关于Xbox 360的连接、编写你的第一个工程项目,以及有关所有的starter kit。 在我前面提到的,TestDriven.NET是Visual Studio的一个好的工具并且测试-驱动的发展是本书一种非常重要的方法论(见第3章)。 另一个棒的工具为.Net发展是Ants Profiler。不像所有的其他工具和至今为止我提到的程序,它是不免费的,但是在网上有替代选择可用,它也能帮忙你。Ants Profiler能用来直接地看你项目的每一代码行话了多长时间。依我之见,这比使用一些高阶层的应用程序性能工具,如来自 Nvidia 的 NvPerf 的工具更有用很多,来自 DirectX SDK的PIX,或使用windows的性能计数器要有用得多。你能很快地明白为什么你的渲染代码部份变得缓慢,太频繁的侦测bug会调用慢速方法,并且通过一些新的有趣的可获得信息,复习你的代码总是好的。因为Internet上有更多的链接,检索XNA 的链接收集在 http://xnadevelopment.com/links.shtml。关于 XNA 有更多站点,并且似乎每天你能见到一些新的社区网站和更多资源。做一个Google搜索会发现哪一个网站是最流行的。.

XNA框架基础——XNA介绍

clock 七月 21, 2010 08:31 by author alex
第1章:XNA介绍 欢迎来到XNA的世界。作为一个游戏程序员,你或许知道 DirectX ,甚至也许具有XNA 框架的基础知识。 这一个章节解释了如何安装 XNA Game Studio Express 和如何以有效率的方式使用它。它也包含相当多的技巧,这些技巧甚至可能对任何一个已经知道基础知识的人都有用。 在下面一些章节中,你将直接地开始开发一些很酷的小游戏。 这部分包含基本的功能和在这一本书中稍后将会使用的辅助类,来为更先进的游戏程序开发一款图形引擎。 为了让一切保持简单,将从第一部分的2D编程开始,然后前进到第二部分的3D。 让我们开始吧! 介绍XNA框架 XNA被微软公司开发,并且开始于多年前,但是保持地非常秘密。在2004年GDC(年度最大的游戏开发讨论会)上微软第一次宣布XNA。XNA不仅仅像DirectX一样是个框架;它还包含很多工具,甚至是一个自定义的IDE。因为直到2006年,还没有一点工具被发布,DirectX的开发者们仅仅在2004到2006年的DirectX SDK文档的右上角标示了“XNA”的图标。 图 1-1 这意味着微软已经着手 XNA 的框架有相当时间了,但是开发者并不真的知道所期待的是什么。它可能是 DirectX 框架的一位继承者, 但是当2005 年底,Direct3D 10 Beta在Windows Vista 上被发布, DirectX 似乎仍然是这个新操作系统的首选图形框架。然后在 2006 年初期微软 XNA 建立,在 GDC 2006 年三月时CTP 被发布。然后在2006年初 的GDC上,Microsoft XNA Build March 2006 CTP被发布。XNA Build 也是一个工具,它允许你管理复杂的编译过程,类似于 Msbuild 和Ants这样的工具,但是更复杂和强大。因为微软的 Mech Commander 2也被作为一个开源软件发布。 许多人下载它并且重编译MechCommander 2这个游戏。但是一段时间以后,没什么更多的事发生,特别是小型和中型开发团队不真的需要一个复杂的编译管理工具。 然后它安静了好一阵子,并且只有微软职员和 DirectX MVPs(我是幸运者之一)开始知道即将来临的 XNA 框架和 XNA Game Studio要发布。世界上的其它人在八月的 Gamefest 会议才发现有关内容,在这里微软宣布在 2006 年8月30 日发布XNA Game Studio Express beta 1 。 第一个beta只包含了一个初学者工具包,“Space Wars”,而且 XNA 没有包括很多的3D功能。许多开发者和爱好者尝试 XNA ,并且在它的Sprite类的帮助下写了许多小型的 2D 游戏。 虽然你可以很快地创建你简单的射击型游戏,写你自己的3D模型导入器和渲染代码却很困难。 XNA Game Studio Express 最初的目标是初学者、爱好者和学生,已允许他们快速开发自己的Windows和XBox360平台的游戏。 但是这不意味着专业的游戏工作室不能使用 XNA。XNA Game Studio Professional 这样的一个特别版本,目标就是专业的游戏工作室,它在 2007 年夏天将被发布。但是如果你想要用Visual Studio 2005 专业版开始开发, 下面我会在这一章节的后面描绘如何有效率的让VS和XNA工作的窍门。 值得高兴地是,微软在几个月之后的2006年11月发布了下一个beta版,这发生在2006年12月XNA Game Studio Express最终发布之前。最终版包括了容量管道和许多你将在第二章和第三章学习的新特色。 XNA 完全免费而且允许开发者一次性同时地创建游戏的Windows平台版和 Xbox 360 平台版。 但是如果你希望你的 XNA 游戏运行在 Xbox 360 控制台,你必须参加 “Creators Club”交纳 $99 的年费。 XNA Game Studio Express 图1-2向你展示了 XNA Game Studio Express,学习该如何立刻安装它。 图 1-2 屏幕不仅仅看上去和Visual C# 2005 Express相似,实际上它就是VC# 2005。如果你创建一个XNA工程项目, 仅仅只要某些小改变。 在“Tools”也有一个额外的选项--〉“Options”,它允许你选择 Xbox 360 设备而且输入密钥。另外,有一些新的特征在 IDE 内; 例如, 内容管道(content pipeline)允许你快速地把纹理,模型、和着色器(shader)导入到你的工程。更多关于所有的信息是很少的。 XNA Game Studio Express当前只是用 XNA 框架开发游戏的唯一可获得的IDE,但是微软在 2007年某一时间(夏季或更晚)将会提供XNA Game Studio Pro 。 XNA Game Studio Professional 将会基于Visual Studio 2005 Professional Edition 并且让你使用所有的Visual Studio插件和特性。 应用程序模型 XNA 框架被分为三个核心部份:(见图 1-3):: 在Microsoft.Xna.Framework.dll中的XNA图形引擎 在the Microsoft.Xna.Framework.Game.dll中的XNA应用程序模型 在Microsoft.Xna.Framework.Content.Pipeline.dlls中的XNA内容管道   图 1-3 所有这些dll文件被C#编写,而且完全是托管的dll。这意味着你能用一个类似Reflection的工具打开这些dll (该工具可以从http://www.aisto.com/roeder/dotnet得到)而且直接看到它们如何工作(见图1-4) 。大多数的内在功能就像DirectX的dll,而且一样单一化。 内容管道(content pipeline)一言难尽。   图 1-4 看一看应用程序模型。 每个 XNA 工程项目使用一个Game类,它包含所有重要的游戏组件,图形设备,windows设置,和内容管理器。在这里,你也可以添加输入和声音处理。基本上,你的游戏中的一切是以Game类为基类的高层次类,或者至少某些组件来自于Game类。 下面是Game类中三个最重要的方法(见图1-5) 。 对于最后的发布版本,微软把LoadGraphicsContent 和 UnloadGraphicsContent助手方法默认地添加到Game1.cs类,这个类是在你创建一个新的XNA工程项目时自动创建的。但是这些方法在本书将不被采用,因为一切要初始化和加载的代码放在Initialize方法中,要简单得多。   图 1-5 Initialize () Update (GameTime time) Draw (GameTime time) 你很可能已经猜测到所有的这些方法要做什么。 Initialize 加载你所有的游戏内容,设定你所有的启始设定,而且初始化你需要的每件事物。 如果你想要跟随微软提供给 XNA 的设计样式,你就用LoadGraphicsContent方法加载一切。在每一帧被绘制之前,Update方法将被调用,它将更新你的游戏时间、输入、声音和其他一切在荧屏上不可见的事物。 即使你的游戏被GPU限制,比Draw更频繁被调用的Update方法,也能很好的发生。但是你的更新代码应该与绘图代码相分离运行,并且这本书中没有需要特别注意Update 和 Draw 被调用的次数的范例。最后,Draw被每一帧调用,来绘制屏幕上的一切。Update 和 Draw的分离可能不总是重要的,几乎总是可能被单元测试所忽略,如果最终游戏在确定游戏逻辑独立运行于绘图代码上不是非常重要。举例来说, 在Windows平台上,用户可能按”Alt +Tab”键或者将游戏最小化, 在这种情况下,Draw不再需要再次被调用,但是也许你希望游戏在后台继续运行。 这对于网络游戏确定玩家仍然同步尤其重要。 另外,你能把 GameComponent 这些类添加到你的游戏类,游戏类再次拥有一个 Update和 一个Draw 方法。 这两个方法都会从你的游戏的Update and Draw 方法自动地被调用。 初始化能直接地在构造器那里发生。最初,微软想要开发者使用Visual Studio设计器,来创建和添加游戏组件,这个设计器能被看作是XNA Game Studio Express (30 August, 2006)的第一个beta版。 这个设计器特色后来因为它没有很好地工作,不支持 Xbox 360 平台而被删除,无论如何没有很多设计者使用它。 游戏组件化思想是说重复使用你的部份代码,并且使它们非常容易嵌入你的游戏。例如一个帧计数器或者是一个天空盒,它作为3D背景的映射渲染器。 依我之见,有二个主要的不利点: XNA没有标准的游戏组件被运送;而且自己写这样一个应用程序模型,甚至扩展它的代码也不是真的困难。 在这一本书中,我将不使用许多GameComponent 类, 但是把它们插入到你的代码是你的自由。阅读第 4 章 GameComponent 类的更多细节,并且学习它的优点和缺点。 因为游戏类有一个Components属性, 增加更多的组件非常容易。 不要说我错误,游戏组件的基本思想真的很棒;当第一个XNA beta版被发布的时候,关于游戏组件和该如何联合它们,有一个来自于Mitch Walker的网络小广播,他是微软XNA框架的程序经理。首先,我不是非常确信内容管道和游戏组件思想,考虑了什么。这个网络广播看上去很酷,但是当我开始给我的第一个XNA游戏项目编码的时候,我没有在当前的第一个beta里找到非常有用的设计器。在第二个beta和最终发布版,大多数初始化游戏组件的代码被删除,XNA Game Studio也有了图形化的设计器组件。这种情况的产生是因为Microsoft 不能找到一条途径来实现设计器,以及对于XBox360控制台,游戏组件化思想是不是有效(之前它仅仅工作在Windows平台)。只是证实了我的第一感觉,游戏组件化思想不是非常有用,并且甚至可能限制你的某些考虑,例如不得不考虑到自己绘制图形(更多细节看第四章)。 这情形类似于,每个游戏执行自己的UI和菜单逻辑,这是相当有争议的。但是如果你考虑到它,就像Windows给每个应用程序使用一些标准菜单是多么令人生厌,而且看到每一款游戏有一个新的菜单是多么好的体验。你还会容易的选取代码 并且创建你自己的游戏组件如果你想创建一个新游戏,并且你只是重用代码(例如SkyCubeMapping类)。某些游戏组件像摄相机camera、屏幕快照screenshot capturer 这些类是组件能在许多其他游戏重用的好例子,但是本书几乎所有其他的一切都没有使用游戏组件化来实现。 它总是一种美好的经验在哪些菜单在每场游戏中被产生见到一个新的方法。如果你想要产生一场新的游戏,你能仍然非常容易地吸取代码而且产生你自己的游戏成份, 然后你能仅仅重复使用代码。(举例来说, SkyCubeMapping 类)像来自第 4 章的照相机和 screenshot capturer 类的一些游戏成份是能在许多其他的游戏中被重复使用的成份的好例子,但是几乎在来自这一本书的游戏的其他每件事物被实现不使用游戏成份。 关于应用程序模型,微软的愿望之一就是游戏开发者社区能容易地创建并且分享他们的游戏组件,而且改善 XNA 方面的社区。 你能在 www.codeplex.com 上检索出eXperience工程项目,得到更多的信息。 内容管道 内容管道被用来导入、编译、而且加载像纹理、3D模型、着色器(shader)、游戏的声音文件这些游戏资源到你的工程项目(见图 1-6) 。 它大大减少了自定义代码的数量,这些代码你必须得到图形,3D数据,着色器(shader)在你的游戏。 例如,如果你拖拽了一个模型文件到你的工程项目,而且它使用二种纹理和一个特定的着色器(shader)你不是必须自己做这些; 内容管道的输入器“编译”数据为二进位的格式,而且在这个过程得到你需要的每件事物。   图 1-6 说到着色器shader,你把模型添加到工程项目会包含一个错误。 在过去,你将会启动你的游戏工程项目, 然后得到一个异常,告诉你着色器shader 无法被编译,而且游戏失败。 现在着色器shader 被编译在生成解决方案的过程,而且你不是必须启动游戏来看它是否工作。 通过行号和来自于XNA Game Studio Express编译输出窗口的错误信息,你能很快地修订错误和重新生成。 内容管道(content pipeline )并不是由一个dll构成的; 它有五个不同的dll: Microsoft.Xna.Framework.Content.Pipeline.dll包含了内容管道(content pipeline )的基本功能。 Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll被用来编译和导入着色器(shaders )。 Microsoft.Xna.Framework.Content.Pipeline.FBXImporter.dll是所有 dll中最大的,而且包含大量导入.fbx格式的3D模型文件的代码,并且支持许多特性, 例如蒙皮和骨骼。 Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll 用来导入对游戏的纹理文件。这些文件可能已经是DirectX格局的dds文件(这是纹理和支持硬件压缩的最好格式),但是.png,.jpg,.bmp, 和.tga 文件也被支持。2D 精灵只也是纹理,而且通常使用不压缩的32-bit格式。 Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll 允许你导入.X 3D模型文件,这是一种被许多DirectX应用程序和范例所使用的格式。 你的游戏本身将不再需要这些dll之中的任何一个; 它们仅仅被用来建立和编译内容为.xnb文件(XNA 二进制)到你的建立过程。 这会让部署很容易,因为你再也不必担心游戏内容文件;它很容易确保所有的内容文件在你启动游戏的时候。 不要修改.xnb文件,它们只是.exe 那样的输出格式,而且不应该被直接修改。 数据也不会被转换回纹理、模型或着色器shaders (也有可能逆转,但是没有那种工具)。 在Windows平台和 Xbox 360 平台上的.xnb 文件也大不相同,然而游戏原始码和内容文件可能完全相同。 另外,你能创建你自定义的内容处理器,这允许你编译任何其他的游戏资源 (举例来说,另一个模型格式) 为.xnb文件。当你必须确定你所有的 3D模型已经有(法线映射shader的)切线数据的时候,你在第二部分探究这些。 好的,那是你现在所需要的所有基础。 现在是该行动并且编译你的第一个游戏的时候了。

《XNA高级编程:Xbox 360和Windows》5-1

clock 五月 11, 2010 22:19 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-7

clock 五月 11, 2010 22:18 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-6

clock 五月 11, 2010 22:14 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-5

clock 五月 11, 2010 22:06 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-4

clock 五月 11, 2010 22:06 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-2

clock 五月 11, 2010 21:54 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-3

clock 五月 11, 2010 21:54 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》4-1

clock 五月 11, 2010 21:52 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》3-10

clock 五月 11, 2010 21:50 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》3-9

clock 五月 11, 2010 21:48 by author alex

节选自http://www.cnblogs.com/zoujia867/tag/XNA/

[更多...]

《XNA高级编程:Xbox 360和Windows》3-8

clock 五月 11, 2010 21:43 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》3-7

clock 五月 11, 2010 21:43 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》3-6

clock 五月 11, 2010 21:41 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

《XNA高级编程:Xbox 360和Windows》3-5

clock 五月 11, 2010 21:38 by author alex
节选自http://www.cnblogs.com/zoujia867/tag/XNA/ [更多...]

友情链接赞助