关于2D游戏引擎设计有哪些很好的资源
What are some good resources on 2D game engine design?
我在业余时间使用C++和DirectX进行2D游戏开发。我发现企业问题域建模方法并没有我想要的那么多帮助;)
我或多或少在寻找相当于基本游戏引擎设计的"最佳实践"。实体应该如何相互交互,动画和声音应该如何在理想世界中表示,等等。
有人有可以推荐的好资源吗?
Gamedev.net 通常是我了解游戏开发社区中其他人在做什么的地方。
也就是说,恐怕你会发现游戏开发中的"最佳实践"概念比大多数人更不稳定。游戏往往是如此专业的应用程序,几乎不可能给出任何"一刀切"的答案。对俄罗斯方块有用的东西对小行星来说将毫无用处,而一个对《光环》完美有效的模型对马里奥来说可能会惨败。
您还会很快发现,纹理、网格、级别、声音或动画格式没有所谓的"行业标准"。每个人都只是自己滚动或使用平台方便的任何内容。你偶尔会看到像 COLLADA,这很好,但它仍然只是一种中间格式,旨在使写作导出器更容易。
如果你是游戏开发的新手,我的建议是:不要在第一次尝试时就因为你的代码结构而自杀。尝试一个简单的游戏,比如小行星,然后破解直到它起作用,无论代码多么"丑陋"。使用您熟悉的简单格式,而不必担心它们在大型项目中的承受能力如何。不要担心插件、皮肤、编辑器或任何其他绒毛。只要让它工作!然后,当你完成第一个,所有重要的游戏时,选择另一个,这一次清理代码的一个或两个方面(但不要过火!从那里开始迭代!
我向你保证,这将使你比任何数量的在线"正确方式"都更快地走得更远(这来自一个做了很多戳的人)。
最后一个想法是:如果你觉得在更明确的空间里工作更舒服,看看XNA或类似的库。他们将预定义一些要使用的"最佳"格式,并为您提供使用它们的工具,从而消除了一些最初的猜测。
祝你好运,最重要的是记住:游戏(及其开发)应该是有趣的!不要太纠结于小事!
做一个游戏。完成后,再做一个。看看你喜欢什么,不喜欢什么,然后做另一个。
说真的,你可以阅读所有你想要的游戏设计的"最佳实践"指南,但最终归结为经验。获得经验的唯一方法是坐下来写一个游戏。在你这样做几次之后,你会对如何编写游戏有更好的了解。
安德烈·拉莫斯(Andre Lamothe)为贡献者的书。
GameDev也有很多文章。
同意你的看法:企业应用程序不会让你为游戏编程做好准备。
我用python,java,html/php和perl创建了一些小型游戏。 您可能知道,游戏的基本结构是:
主循环 :
handleInput()
updateGameLogic()
渲染图像()
屏单线程游戏,就像 70 年代或 80 年代的任何东西一样。 但我不觉得这种结构特别适合多屏游戏(如RPG)或任何更奇特的游戏。 它不能很好地线程。 代码变得非常时髦,因为您需要处理各种输入。 它不能很好地扩展。
但是,在我过多地抨击这个比喻之前,请注意,这是一个很好的起点。 我甚至建议学习Python/Pygame,并开始用该工具而不是C++工具构建游戏,这使设计和实现过程复杂化。 当你在python中制作原型时,你会看到游戏更快地成型,并遇到与语言无关的问题。
对我来说,游戏编程中最困难、最耗时的方面是图形和声音资产。 虽然我是一个音频书和业余音乐家,但创作可信和适当的音乐和 SFX 本身就是一个项目。 我没有图形天赋,所以我必须依靠修改现有图像或使用免费提供的图像。 幸运的是,有一种广泛使用的免费字体可用于游戏(别无他法,因为它们几乎普遍不好)。
最后,没有什么比开源更能看到其他项目如何处理这个问题了。韦斯特诺斯战役是一款成熟的中型游戏。 你可能想看看那里发生了什么。 同样,python中的游戏经常提供其源代码,因此您可以查看那里的数百个项目。 您也可以反编译 atari 2600 ROM,但这并不能告诉您有关当今编程的信息。 旧的VCS是一种专用设备,以非常依赖系统的方式处理其应用程序。:-D
最后,我也喜欢安德烈·拉莫特。 我有他1993年的老书,有一百万页厚。 虽然它仍然是一些通用游戏创意的一个很好的参考,但其中很多都被当时不存在的免费库和框架所消除。
祝你的项目好运。
既然还没有提到,为什么不从查看已发布到社区的现有引擎开始呢?既然你说的是2D,我会回去推荐类似Abuse的东西。是的,它很古老,大多数有趣的部分都是Lisp - 但是这个游戏在一段时间内变得非常流行,这意味着他们正在做正确的事情。
碰巧的是,我认为原始游戏的大部分内容都是用Lisp编写的,这是一个非常有用的教训。选择最强大的语言/工具,不要担心性能。您以后始终可以在 C 中优化慢速部分。
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 很好的语法来获取对向量/数组数据的大小引用?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 尽管一切看起来都很好,但值不会交换
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 使用移位的无符号数字作为数组的索引号是一种很好的做法
- 是否很好地使用状态模式来维护当前选定的对象?
- C++|以一种很好的方式将树(不一定是二进制的)打印到stdout
- 静态库单独使用很好,但在引用时会抛出错误
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 有没有办法关闭文件? fclose 不能很好地工作
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- libc++:为什么流关闭后仍然很好
- 很好的资源,练习c++数组和指针
- 关于2D游戏引擎设计有哪些很好的资源