XNA 游戏引擎示例
XNA 游戏引擎示例 C# XBOX 动画物理带骨骼模型加载粒子
引言
很抱歉,游戏代码被匆忙剥离,状态不佳,但它在很多方面仍然有用。我将在未来几年内尝试编写一个针对初学者的完整游戏教程。
在此状态下,谁会从中受益
这有助于初学者窃取 XNA 中缺失的部分。它应该对初学者到中级 XNA 程序员非常有帮助,特别是动画部分/如何加载其他动画模型。它包含一个升级的 ms 蒙皮模型示例。数学库还包含许多易于理解的高级函数,例如将对象旋转到 2D 或 3D 中的另一个对象,以及使用 3D 坐标定位 2D 对象,从网格中获取选定的多边形等。
引擎和 XNA 的背景
一切都针对 XBOX 进行了相当优化的处理,这会使许多人受益。在我写这个的时候,我对 3D 数学几乎一无所知,而且我仍然不是专家,但好处是,我已经将一些东西封装起来,这样你就不需要知道太多就能完成琐碎的任务。当你刚开始接触 XNA 时,你的期望很高,然后你就会发现,即使是 Carmack 或任何人的手中,这个工具包也无法真正制作出《Quake 5》。不仅如此,XNA *本身* 非常不优化,而且*不*像我想象的那样高级。XNA 不是游戏引擎,你必须创建自己的或使用另一个。游戏引擎有点像一个两难;如果你不明白如何自己编写一个,你很可能会在尝试做一些琐碎的任务时卡住。你甚至无法加载一个动画模型(目前)。
有了这个引擎,你就有了一个 GameObject
和 GameObject3D
,它有几个主要的东西,比如 Position
和 Destination
,速度和重力,正如你所期望的那样。你可以用它来制作一个 2D 图像或一个带有动画的 3D 对象,正如你期望 XNA 开箱即用那样。你还可以执行操作,例如使用 mathHelper 工具包获取 3D 对象的 2D x,y 坐标。mathHelper 包含了你构建一个非常简单的游戏所需的一切。(**注意**:不幸的是,Camera 的编写非常糟糕,但你可以轻松地从网上获取另一个 Camera 类并插入。我说它不好是因为它目前硬编码为从顶部向下观看关卡,它可以工作,只是专门针对我设计的游戏。我很快就会更新它。)
特点
2D 部分使用纹理四边形,而不是 spriteBatch。这是因为 gameobject
具有你期望的层属性!GameObject3D
也包含层属性,因此你可以随意混合 2D 和 3D,而不会抓狂!
通过使用 destination 属性轻松移动对象,并捕获 OnClick
、OnCollision
等事件。
ParticleEffects XML 编辑器脚本 gameobject
s 使用 SimpleEmitter
(f4) 生成,并在游戏中重新加载更改,因此你可以实时编辑它们。
该引擎运行得相当不错,它不会打破任何记录,但对于业余爱好者来说,它可以在 XBOX 游戏上为你提供帮助,这根据我使用 XBOX 的经验来说已经很了不起了。许多 struct
s 通过 ref
传递,这给了你巨大的提升,并且当 Isalive == false
时,update 不会被调用。当 isAlive == false
时,对象会在 hashTable
中进出。这使得你可以拥有几乎无限数量未使用的对象。它使用繁重的 OO 结构,由于重写的数量,它在 xbox 上有点延迟,但它更容易使用,所以这比性能更重要。Windows 当然运行得飞快。
动画模型可以正常工作。我不太了解 XNA 的所有新功能,但在我那个年代,这可是相当了不起的!
基本用法
如果你看看 *player1.cs*
public override void Update(GameTime time)
{
float f = 3;
DropCoin();
Destination3D = Levels.Inst.CurrentLevel.FindPos( GameMouse.inst.LClick() ,ref f);
base.Update(time);
}
游戏对象可以是图像或静态模型,你也可以使用从 gameObject3D
派生的 animatedGameObject
来获得动画对象。
这展示了上面如何通过设置其目标来移动对象的代码。所有游戏对象都派生自 gameobject
并存在于一个 gameobject
s 的集合中。游戏对象会自动插入到集合中。
你可以覆盖许多方法来访问诸如碰撞/鼠标操作之类的事件。
粒子效果由游戏对象集合组成。你可以在 XML 中使用粒子项目配置这些集合。例如,硬币星星就是用这种方法生成的。你需要非常熟悉该引擎才能使用粒子效果。如果你了解 gameobject 的每个属性的作用,你就可以使用效果 XML 生成器,因为生成器所做的就是在一个属性网格中加载对象,然后输出它们,并添加一些额外的选项。
项目
游戏示例中的粒子效果
旧版 2009 游戏示例
有趣的部分
- 仍然需要删除很多专业化。这个引擎是为了一个名为 Zombie defence 的小型 Dream build play 游戏而编写的,我仍在开发中。
- 对特殊着色器没有特别的支持。
GameObject3D
派生自GameObject
。它们非常相似,事实上,你可以有一个带有图像的 3D 对象,但这不太有用。在 2D 和 3D 功能之间的混淆方面,这是一个缺点。只需注意在GameObject3D
中使用 3D 属性而不是 2D 属性,例如position3D*
。- Level 类没有特殊的剔除能力,它会绘制整个关卡。这意味着你的关卡不能太大。对于我的简单游戏来说,即使是相当详细的关卡也效果很好。
GODependant
对象存储了引擎的所有依赖项。最终将其移动到 DLL 时,依赖项将被清理掉。 - 3D 音效目前是临时性的。
- 你会看到方法上方有很多
static
变量。它们提高了 xbox 的性能。**使用 slimtune 来分析你的游戏,理解按值传递和按引用传递,并且不要不必要地实例化。**