本文旨在为那些希望开始学习XNA的读者提供一个关于3D渲染和内容处理的示例。虽然这不是一个完整的台球游戏(这将是另一篇文章的内容),但它可以作为一个良好的起点。
本文不是要展示做事情的最佳方式,它只是一个在四到五小时内快速制作的示例。任何改进都是非常受欢迎的!
本文涵盖了以下主题:
压缩包分为两组:
在Article_src中找到的项目是一个Visual C# Express项目。因此,需要Visual C# Express(带有Service Pack 1)和XNAGame Studio(版本1.0 Refresh)来编译和运行它。
本项目可以作为学习中级3D渲染和场景管理概念及其在XNA中的实现的起点。
如果不知道什么是摄像机,如何渲染3D对象(由多边形组成),或者没有一些基本的代数知识,建议首先阅读一些入门教程。在Code Project有更多关于游戏开发的文章之前,一个好的起点是GameDev。
如果已经具备所有这些基础知识,请继续阅读:
尽可能地,一切都以组件化的方式实现。XNA有一个GameComponent类,可以从它继承,它指导以这种方式工作。基本上,所有功能都可以用三个阶段或步骤来表达:
任何3D应用程序都需要一些数据来组成场景,通常包括:
纹理通常在设计套件中创建,如Photoshop、Gimp或其他。材质和3D几何体通常在3D建模软件中创建,如3DSMax、Maya等。纹理也在这里加入3D场景。对于着色器的创建,有许多选择:
不太明确的是如何导出所有这些信息:所有这些都可以包含在一个文件中吗?在许多情况下,不行。
那么,是如何做到的呢?
在Zip文件中找到的项目是一个完整的工作XNAWindows游戏项目。
会稍微谈谈它包含的类。由于空间原因,不能过多扩展这一部分,但如果有任何额外的信息需要,请随时提问:
PositionNormalTexture
:这是一个XNA内容处理器。它用于将用于3D几何体的X文件转换为.xnb格式。它基本上以特定格式写入所有几何体,以便每个模型都以相同的方式表达。TargetedCamera
:一个摄像机类,可以作为轨道目标摄像机工作。只需要告诉它一个初始目标和视点,并调用Orbit方法。CMouseInput
:包括所有鼠标读取功能,并公开两个有用的事件:ButtonChanged和OnMouseMove。两者的工作方式与Windows Forms事件非常相似。Model3D
:设计为GameComponent,封装了一个3D模型。这个类准备好读取从3DS Max导出的X文件。它支持默认材质(通过BasicEffect着色器处理,XNA中的默认值)和DirectX着色器材质(在3DSMax中设计的着色器)。Scene
:这个类只是一个场景管理的示例。在这种情况下,房间和台球桌是不同的模型。它们都在Scene类中,因为它们是场景的一部分。如果想将这个示例扩展到一个完整的台球游戏,这个类将是放置球的集合的完美地方。Settings
:在项目中包含了这个类,以解释如何处理应用程序设置,使其与Windows项目和XBox项目兼容,因为正常的.NET类(System.Configuration)在Compact Framework(因此360)上不可用。MySprite
:这个类是一个绘制精灵的助手,将SpriteBatch、Texture2D、渲染精灵的位置和其他功能(如精灵的着色颜色)保存在单个类中。请注意,使用MySprite渲染大量精灵并不高效,因为它将需要每个精灵一个SpriteBatch。应该使用单个SpriteBatch来渲染大量精灵,但对于这个示例来说,这就足够了(而且非常简单)。它用于在光标位置渲染一个“狙击手”精灵。MySpriteButton
:继承自MySprite,但增加了按钮功能。它包括一个Click事件,非常像Windows Forms中的一个,以及一个鼠标悬停效果,当鼠标悬停在它上面时,改变精灵的着色颜色。它用于用户界面按钮,允许用户选择摄像机的不同目标。BilliardsGame
:这是XNA游戏本身。它继承自Microsoft.Xna.Framework.Game,基本上持有并使用所有其他内容:GraphicsDevice、ContentManager、Settings类的实例、CMouseInput实例、Scene实例、TargetedCamera实例、MySprites和MySpritesButtons用于用户界面等...