2D游戏引擎应该包含哪些内容?

31

好的,所以我最终基于XNA写了自己的游戏引擎,现在我想知道还需要什么才能使它成为一个完整的引擎。

以下是引擎中包含的内容:

  • 物理引擎(Farseer Physics)
  • 粒子引擎(Mercury Project)
  • 2D相机
  • 输入处理
  • 屏幕管理(菜单,暂停屏幕等)
  • 精灵(动画,精灵表等)
  • 还有XNA相关的声音。

我是否遗漏了对游戏引擎至关重要的任何内容?


1
没有任何针对 Stack Overflow 的意思,但你在 gamedev.net 论坛上发帖可能会更好。 - ryeguy
良好(且灵活)的碰撞检测。 - Clinton Pierce
1
碰撞检测位于Farseer物理引擎中。 - Khalid Abuhakmeh
5
你想编写游戏还是引擎?(参考:http://scientificninja.com/advice/write-games-not-engines) - thekidder
3
@clintp - 评论区不是回答问题的地方。 - Steven Evers
16个回答

59

你的做法有些本末倒置。

你的引擎中应该包含以下内容:

所有在你的第一个和第二个游戏中都出现了的代码。

首先,写一个游戏。不要写引擎,因为正如你所发现的,你不知道它应该包含什么或者如何设计。相反,先写一个游戏。

当你有了这个游戏之后,再写另一个游戏。然后,当你完成了那个游戏后,检查第二个游戏的代码。其中多少是从第一个游戏中重用的?

任何被重用的代码都应该被重构到一个单独的项目中。这个项目现在就是你的游戏引擎。

这并不意味着你不应该做规划,也不应该尽力写好的代码。但确保你正在朝着具体的目标努力,可以区分出好的实现和坏的实现。游戏的好的实现是指它能够正常运行、有趣且不会崩溃,所以你应该先写出这样的代码来实现这些目标。

作为引擎的好的实现?这就有些棘手了。渲染器的好的实现是什么?AI框架的好的实现又是什么?粒子系统的好的实现呢?最终,判断你是否有一个好的引擎的唯一方法是看它在实际游戏中工作得如何。因此,如果你没有游戏,就无法评估你的引擎。而如果你没有办法评估你的引擎,你也就无法判断你正在编写的任何代码是否真正有用。


1
真是个简单而又好的看法,jalf (+1)! 话说回来,我相信当你开始创建这两个游戏中的第一个时,你肯定想要一个“基本功能”列表(取决于你正在制作什么类型的游戏)。 - leifericf
1
@Leif:为什么?如果这些功能是基本的,那么你迟早都要添加它们,所以等到需要它们的时候再添加也没有什么损失。而且谁知道呢,也许它们并不是那么基本的。也许你最终会在没有这些功能的情况下完成一个完整的游戏。 - jalf
我明白在某些情况下这样做是有道理的,但是如果没有定义达成目标所需的工作,可能很难获得相对可靠的“整体完整性”、未来的工作和进展。我认为尝试制定计划总是一件好事,然后可以将工作分为有限的部分并确定优先级。如果做得正确,“计划”可以成为重要的参考点和激励因素,即使您根据产品要求进行更改。根据我的经验,“隐含计划”往往会产生非常反生产的结果。 - leifericf
@Leif: 当然,但计划应该是为了创建一个游戏,而不是一个引擎,正是因为这个原因。当我问"我的引擎完成之前需要什么"时,答案是"嗯,这取决于具体情况"。在引擎中可能需要的功能有很多,也可能不需要,而且你以为已经完成的一个功能实际上在实践中无法正常工作,因为你忘记了一些微妙的要求。但是如果你问"我的游戏完成之前需要什么",答案就简单多了:我需要能够移动和跳跃,并追踪敌人的生命值。 - jalf
无论如何,一定要有计划,但是计划必须朝着具体的目标而不是抽象和模糊的“引擎”概念制定。计划中重要的是你能够看到哪些已经完成,哪些还需要完成。只有当你可以评估每个项目的“完成情况”时,才能做到这一点。在一个引擎中,我无法验证例如“渲染雾”功能是否真正完成。它会在我的游戏中工作吗?它是否足够高效?在我拥有游戏之前,我不知道。但是如果我将该函数作为游戏的一部分,那么我只需要运行游戏,就可以看到该函数是否完成。 - jalf
显示剩余3条评论

20

为你的引擎选择一个主题或市场。如果你想做更多超越基本图形引擎的东西,你需要专注于引擎的市场,比如RPG、策略、益智、平台、动作或FPS(好吧,不是FPS)。

这将帮助你确定自己需要朝哪个方向发展,以便在不询问我们的情况下进一步增强引擎的功能。就像虚幻引擎可以做很多事情,但它最擅长的还是FPS游戏一样。同样地,你应该使你的引擎适合某个特定的兴趣领域,从而被用于那种类型的游戏玩法。

你可以让它比较通用,但要意识到,引擎越通用,编程的难度就越大,无论是时间上还是技能上。如果有更专门的平台可用,其他程序员也不太可能使用一款通用引擎(除非只有这款引擎可用)。或者他们会写自己的引擎,因为修改一个通用引擎和创建一个新的引擎的难度差不多。


以虚幻引擎为例:最后的神迹。这是一款很棒的游戏(RPG),但有些时候图形效果非常卡顿,你简直无法相信。这都是因为RPG通常会同时进行许多漂亮的特效,与FPS相比需要更好的粒子引擎降级处理,以避免多个效果同时进行时出现问题! - Ed James

12

还有几件事情:

  • 路径规划 - 对于人工智能非常有用。
  • 人工智能 - 可能 - 取决于引擎的通用性。
  • 高分数
  • 重播 - 使高分数更加有趣,因为您可以观看它们。

你知道有哪些好的XNA/C#路径搜索库吗?或者你只是建议研究所涉及算法并创建适用于特定游戏的解决方案? - Venesectrix
我从未使用过XNA,所以我不太清楚有哪些好的库。我相信已经有许多优秀的库了,但有时候阅读算法并自己实现它也是很好的。 - Zifre
@Venesectrix:寻路(A*是最流行的算法)非常容易实现,而且有很多资源可用。可以参考http://www.ziggyware.com/readarticle.php?article_id=162了解与XNA相关的资料。 - Noldorin

7

以下是一些想法:

  • 人工智能(也许只是简单的AI实用程序,比如寻路算法
  • 保存游戏状态的全部或部分内容(以便在稍后暂停和重新开始,或保存最高分数)。

通用游戏引擎的人工智能有些困难。由于AI过于特定于实际游戏,因此我不确定尝试创建一个作为引擎本身一部分的通用AI会有多大用处。 - Herms
我更倾向于简单的AI算法(比如一个总是朝着你移动的敌人)以及实用工具(例如寻路算法)。 - gnovice
+1:非常好的a*教程。感谢分享。 - Callum Rogers

6

我认为您已经涵盖了2D引擎的一般要求。唯一我会在列表中遗漏的是:

  • GUI库

此外,为了使开发过程更加简便:

您还可以在XNA现有内容的基础上添加另一层:

  • 相当简单的网络/大厅实现
  • 更抽象的多个控制器处理方式(像Resident Evil 5 Coop中的DropIn/DropOut),也许是基于事件的

最后,您可以添加一些“即用型”着色器。也许可以从已停止开发的FaceWound(来自“Garry's Mod”开发者)中获取一些灵感。


3

这取决于游戏的类型,但通常需要一个良好的网络框架。

现代许多游戏,包括2D游戏,似乎都有某种形式的网络功能。


2
很好,我和我的朋友正在开发一个游戏引擎。我们已经拥有你提到的所有东西,此外还有以下内容。
  • 音频管理器:一个简单的类,用于处理XNA中的背景音乐和音效。
  • 视频管理器:不复杂,一个简单的类,用于在XNA中播放视频。
  • 特效管理器:负责像bloom、模糊、黑白颜色等效果。
祝好运 :)

2
  • 动画框架,使您可以说:将此精灵移动到这个方向,沿着这条路径使用这个速度、加速度等
  • 基本GUI系统。不要实现整个Windows,但基本的东西如指针和按钮等-保持基本
  • 调试组件用于显示FPS、精灵数量等

另一个好方法是制作一些游戏,然后您很快就会发现每个游戏都需要重复做哪些事情,然后再研究如何将其纳入引擎中。


2
  • 2D灯光系统是一项很好的高级功能。您可以使用Krypton来实现。
  • 地图编辑器。或者更好的支持任何与"Tiled Map Editor"兼容的瓦片地图格式。这样,您就可以直接使用Tiled。
  • 用于游戏动作的计划程序/定时器。
  • 屏幕擦除效果,例如翻页、淡出等,以在屏幕之间进行漂亮的过渡。
  • 具有内置视差的游戏层也很有用。
  • 游戏控制台,可在无需重新启动的情况下处理命令或脚本。
  • 轻松加载纹理图集作为精灵或动画。

1

3D加速应该在2D引擎中实现。

利用大多数人现在拥有的3D硬件,是获得2D游戏惊人性能的最佳方式...


你有这种情况的示例吗? - Khalid Abuhakmeh
2
Xna已经使用3D加速了,因此这是自动构建的。实际上,这只是意味着它使用GPU-在我的理解中。 - Jesper Blad Jensen
实际上,XNA精灵已经通过3D加速完成了,所以您不需要担心这个问题。 - Marcel Jackwerth
正如前面提到的,使用XNA。当然,你可以将精灵视为沿垂直于屏幕的表面上的纹理,并带有一些透明度。以这种方式进行操作意味着你几乎可以免费获得缩放和旋转功能,并获得大量的硬件加速。 - dicroce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接