XNA 台球视觉演示:一个 XNA 内容处理和 3D 渲染的例子






4.97/5 (15投票s)
本文是 XNA 可视化渲染和内容处理的一个示例,对于想要开始学习 XNA 的人来说是一个很好的起点。
- 下载演示 - 18.4 KB
- 下载演示内容 1 - 2.23 MB
- 下载演示内容 2 - 1.86 MB
- 下载演示内容 3 - 2.86 MB
- 下载源代码包 1 - 968 KB
- 下载源代码包 2 - 2.08 MB
- 下载源代码包 3 - 3.19 MB
引言
本文是 XNA 3D 渲染和内容处理的一个示例,对于想要开始学习 XNA 的人来说是一个很好的起点。虽然它不是一个完整的台球游戏(那将是另一篇文章),但它也可以成为台球游戏的一个很好的起点。
它并非旨在展示最佳的实现方式,这只是我花四五个小时制作的一个快速示例。任何改进都非常欢迎!
它涵盖以下主题
- 内容处理器开发
- 从 3DSMax 导出内容,包括 Max 着色器,可以直接与 XNA 配合使用
- 内容加载
- 3D 渲染,带和不带 Max 着色器
- 基本相机开发
- 基本精灵管理
- 基本自定义用户界面开发
- 鼠标读取
- 场景和 3D 模型管理
- 使用 XML 进行设置序列化
- 附加模型属性实现
下载说明
Zip 文件分为两组
- Article_demo_XXX:仅用于二进制文件。(每个 demo_XXX Zip 文件都应解压缩到同一文件夹中。)
- Article_src_XXX:用于完整的 Visual Studio 项目(每个 src_XXX Zip 文件都应解压缩到同一文件夹中)
您在 Article_src 中找到的项目是 Visual C# Express 项目。因此,您需要 Visual C# Express(带 Service Pack 1)和 XNA Game Studio(版本 1.0 Refresh)来编译和运行它。
背景
此项目可作为学习一些中级 3D 渲染和场景管理概念及其在 XNA 中的实现的起点。
如果您不知道相机是什么、3D 对象(由多边形组成)如何渲染,或者没有一些基本的代数知识,我建议您先阅读一些入门教程。在 Code Project 有更多关于游戏开发的文章之前,一个很好的起点是 GameDev。
如果您已经掌握了所有这些基本知识,请继续阅读
在可能的情况下,所有内容都以面向组件的方式实现。XNA 有一个可以继承的 GameComponent
类,它指导您采用这种工作方式。基本上,所有功能都可以通过三个阶段或步骤来表达
- 初始化:为对象的启动、内存预留等调用一次
- 更新:每帧调用一次,执行必要的任何状态更新
- 绘制:每帧调用一次,绘制可见对象、UI 等。
3D 场景初步
任何 3D 应用程序都需要一些数据来构成场景,通常是
- 3D 或 2D 几何体
- 纹理
- 材质和着色器
- 任何附加信息,例如物理、游戏特定属性等
纹理通常在 Photoshop、Gimp 或任何其他设计套件中创建。材质和 3D 几何体通常在 3DSMax、Maya 或其他 3D 建模软件包中创建。纹理也在这里并入 3D 场景。对于着色器创建,有许多选项
- 使用特定软件,如 ATI RenderMonkey 或 nVidia Shader FX
- 使用 3D 建模软件包本身
- “手工”编写它们(使用有史以来最强大的工具:记事本,就像 这位 朋友总是说的那样 - Hi Chema!-;)
可以通过建模软件包(使用自定义属性)将附加对象属性包含在场景中,或者可以在单独的文件中手动指定(我更喜欢这种方式,例如使用 XML 文件)。
不那么清楚的是如何导出所有这些信息:是否可以全部包含在一个文件中?在很多情况下,不行。
那么,我是怎么做的呢?
- 由免费下载的模型组成的 3D 场景
- 在 3DSMax 中建模的一些基本几何体(墙壁等)
- 用 Gimp 制作的基本纹理
- 用我们自己的软件制作的高级照明纹理
- 在 3DSMax 中制作的材质
- 在 3DSMax 中制作的着色器(使用 DirectX 着色器材质)
- 所有内容都通过 KW X Export 插件 导出为 X 文件,适用于 Max9
使用代码
您在 Zip 文件中找到的项目是一个完整的 XNA Windows 游戏项目。
我将简要介绍它包含的类。由于篇幅限制,我无法过多扩展此部分,但如果您需要任何附加信息,请随时提问
PositionNormalTexture
:这是一个 XNA 内容处理器。它用于将用于 3D 几何体的 X 文件转换为 .xnb 格式。它基本上以特定格式写入所有几何体,因此每个模型都以相同的方式表达。TargetedCamera
:一个相机类,可以作为轨道目标相机使用。您只需告诉它一个初始目标和视点,然后调用 Orbit 方法。CMouseInput
:包含所有鼠标读取功能,并公开两个有用的事件:ButtonChanged
和OnMouseMove
。两者都以与 Windows Forms 事件非常相似的方式工作。Model3D
:设计为一个封装 3D 模型的GameComponent
。该类可以读取从 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 中的事件,以及一个鼠标悬停效果,当鼠标悬停在其上时改变精灵的色调。它用于 UI 按钮,允许用户为相机选择不同的目标。BilliardsGame
:这是 XNA 游戏本身。它继承自Microsoft.Xna.Framework.Game
,并且基本上持有和使用所有其他对象:GraphicsDevice
、ContentManager
、Settings
类的实例、CMouseInput
实例、Scene
实例、TargetedCamera
实例、用于用户界面的MySprites
和MySpritesButtons
,...
希望您觉得有用
关注点
请务必查看 XNA 主页 以获取框架更新、教程、入门工具包,并在遇到问题时始终查看 论坛。也许有人已经遇到过,其他人也已经找到了解决方案。
那里有很多好人! ;)
历史
- 初始版本:2007 年 11 月 19 日。