65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2007年11月19日

CPOL

6分钟阅读

viewsIcon

69321

downloadIcon

13450

本文是 XNA 可视化渲染和内容处理的一个示例,对于想要开始学习 XNA 的人来说是一个很好的起点。

Screenshot - screenshot_1.gif

引言

本文是 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 类,它指导您采用这种工作方式。基本上,所有功能都可以通过三个阶段或步骤来表达

  1. 初始化:为对象的启动、内存预留等调用一次
  2. 更新:每帧调用一次,执行必要的任何状态更新
  3. 绘制:每帧调用一次,绘制可见对象、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:包含所有鼠标读取功能,并公开两个有用的事件:ButtonChangedOnMouseMove。两者都以与 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,并且基本上持有和使用所有其他对象:GraphicsDeviceContentManagerSettings 类的实例、CMouseInput 实例、Scene 实例、TargetedCamera 实例、用于用户界面的 MySpritesMySpritesButtons,...

希望您觉得有用

关注点

请务必查看 XNA 主页 以获取框架更新、教程、入门工具包,并在遇到问题时始终查看 论坛。也许有人已经遇到过,其他人也已经找到了解决方案。

那里有很多好人! ;)

历史

  • 初始版本:2007 年 11 月 19 日。
© . All rights reserved.