我应该如何用代码为经济型游戏建模?


10

我想创建一个基于古代文明的经济游戏。我不确定如何设计。如果我正在开发一个较小的游戏,例如《太空侵略者》的副本,那么构造这样的游戏就不会有问题:

  • 主控制类
  • 图形类
  • 玩家等级
  • 敌人阶级

我不知道如何为大型项目(例如经济游戏)做到这一点。我是否创建一个包含许多城镇的国家/地区类别?城镇是否包含很多建筑类别,大多数包含人口类别?我是否会开设可供玩家绕行的寻径课程?


3
您可能想要使用某种形式的Entity-Component-System(实体规范系统)(这里是规范参考)-根本不让实体绘制自身(特别是如果您有很多实体的话)。
ThorinII

9
您会惊讶于大多数“大型”游戏多么糟糕,杂乱无章,骇人听闻。它们围绕截止日期和里程碑而构建。只需编写一个游戏,任何结构超出您需要编写的结构都将与目前大多数AAA游戏一样好。
肖恩·米德迪奇

即使您不完全使用ECS,也可以不重复代码,仍然可以使控制器迭代实体并调用渲染器,甚至让渲染器进行扫描。在100个地方进行次要代码更新很痛苦。
MickLH 2013年

1
我认为,从《太空侵略者》过渡到您所描述的复杂游戏有点过分激烈。在进入大型游戏项目之前,这两款游戏之间还有更多的学习步骤。考虑构建2D Sidecroller平台并逐渐增加游戏的复杂性。从一档换到五档可以使您达到120公里/小时,但效率(时间/精力)却不如逐级提升。
埃米尔·利马

2
您在这里似乎有两个问题,我无法确定哪个对您更重要。第一个是关于如何避免传递对对象的大量引用,第二个是关于如何处理游戏中逻辑实体到代码类的映射。这些问题有不同的答案,我认为您应该针对它们发布不同的问题。我将编辑掉“避免传递引用”部分。随时重新发布它(也可以考虑在此站点上搜索有关“避免单例和全局变量”的主题,因为答案非常相似)。

Answers:


5

我是否创建一个包含许多城镇的国家/地区类别?

当然。

城镇是否包含很多建筑类别,大多数包含人口类别?

当然。

我是否会开设可供玩家绕行的寻径课程?

当然。

您上面建议的所有内容似乎都是合理的。从长远来看,这可能不是您的最佳方法,但这很好。您知道这显然很有意义,因为这是最先出现的组织模型。采取这一点并从中开始实施很重要。两者都会使您入门,使您摆脱通常在开发初期就困扰开发人员的初始“设计瘫痪”,并且(如果事实证明存在某种缺陷)会教您一两个有关优缺点的信息。特定的设计方法。

您自然而然地想到了这些概念,并根据一些简单的规则将它们分组为代码:

  • 这个概念在行为或数据上与我已经拥有的其他对象是否有明显不同?(国家和人民共享的有意义的数据或行为很少(如果有的话),因此应该在游戏中用不同的类型表示)。
  • 我什至需要以一种显着的方式在代码中操纵这个概念吗(如果您的游戏与单个人打交道,则可能需要Person该类,但如果游戏只关心它们的整体,例如在早期版本的SimCity中,您可能不需要该类型也不需要该类型的实例来创建城镇人口的1:1映射(int populationCount可能就足够了)。
  • 这个概念需要状态吗?如果是这样,应该以某种方式封装它,使我可以存储此状态(一个类),而不是一堆免费函数。(寻路实现没有类似的现实世界对象,但是它确实需要跟踪数据,例如已经考虑了映射中的哪些节点,与通过将其存储在一堆中相比,最好通过类来完成隐藏的全局变量并具有独立功能)。

尽管很简单,但是在尝试确定是否以及如何将思维概念转换为源代码时,回答这些问题可以使您受益匪浅。您可能还需要阅读有关面向对象设计的SOLID原理

请注意,在注释中提出的有关实体/组件系统的建议也是一种有效的方法,尽管我会在这里避开它,除非您将项目范围缩小到较小的范围(这是因为在一个项目中可能面临两个新的,大的挑战太令人生畏,可能会稀释您仅专注于一个方面所获得的教育收益)。在面向组件的模型中,上述问题中的“类型”变得更加隐式:不是代码中的具体类型,而是由形成实体的组件集合定义的隐式类型。可以应用相同的指导原则。


1

对于简单的游戏,您所描述的内容(逻辑游戏对象的每种主要类型都有一个类)非常有意义。如果这是您第一次编写此类游戏,我建议您这样做。

几点提示:

  • 是一个球员从不同的真正敌人?许多功能可能是相同的,因此这些功能通常应为同一类或从同一基类扩展。考虑具有两个子类HumanPlayerAIPlayerAbstractPlayer基类-所有通用功能都可以在AbstractPlayer中使用
  • 优先使用组合而不是继承来配置对象。不要使继承层次结构太深。如果您开始调用ForgeWithSteelAnvil类,那么您应该担心:Forge可能是Building的子类,但是所使用的砧的类型应该是该建筑物中包含的对象。
  • 同样喜欢的属性,使您可以配置对象,而不是增加上百稍有不同的对象类。

在更复杂的游戏中,您可以使用更高级的技术,但是我建议您不要使用这些技术,除非您对基本的OOP方法非常满意(即成功制作了几款完整的游戏)。更高级的方法可能包括:

  • 基于原型的对象模型 -对所有游戏对象使用单个类,并通过属性/属性和组成对所有对象建模。比标准的OOP灵活/动态得多,但是管理起来更棘手(特别是,如果您做一些愚蠢的事情,编译器将无法为您提供很多帮助)。我在我的小Roguelike游戏《暴君》(https://github.com/mikera/tyrant)中使用了此效果
  • 实体组件系统 -如果您要在许多不同类型的游戏对象中混合并匹配许多复杂行为,则非常有用。非常强大,但很难正确。

0

可以使用几种方法来组织实体和数据集。我更喜欢编写电子表格文档并来回移动测试数据,以确保效率高。如果您自己制作游戏,请记住它对您有意义。有时,最有效的方法是使代码的效率略微降低,以使项目更简单。

如果您希望在结构化内容方面获得更多帮助,请找到使用类似结构或样式的旧游戏源代码,并找到其解决方案。然后对其进行优化,并根据自己的喜好进行修复。


-1,因为这似乎没有解决代码的组织问题,并且建议您盲目复制其他游戏的功能,而无需讨论理解游戏做出的任何设计决策的折衷方法。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.