问题标签 [entity-system]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
161545 浏览

architecture - 基于组件的游戏引擎设计

我一直在研究游戏引擎设计(特别关注 2d 游戏引擎,但也适用于 3d 游戏),并且对如何进行它的一些信息感兴趣。我听说现在许多引擎正在转向基于组件的设计,而不是传统的深层对象层次结构。

您是否知道有关此类设计通常如何实施的信息的任何良好链接?我已经看到了你的层次结构的演变,但我真的找不到更多的详细信息(他们中的大多数似乎只是说“使用组件而不是层次结构”,但我发现改变我的想法需要一些努力两个模型之间)。

任何好的链接或信息都将受到赞赏,甚至书籍,尽管此处的链接和详细答案将是首选。

0 投票
4 回答
10252 浏览

oop - 基于组件的游戏引擎中的通信

对于我正在制作的 2D 游戏(对于 Android),我使用的是基于组件的系统,其中 GameObject 包含多个 GameComponent 对象。GameComponents 可以是诸如输入组件、渲染组件、子弹发射组件等。目前,GameComponents 拥有对拥有它们的对象的引用并可以对其进行修改,但 GameObject 本身只有一个组件列表,它并不关心组件是什么,只要在对象更新时可以更新它们即可。

有时一个组件有一些 GameObject 需要知道的信息。例如,对于碰撞检测,游戏对象向碰撞检测子系统注册自己,以便在它与另一个对象碰撞时得到通知。碰撞检测子系统需要知道对象的边界框。我将 x 和 y 直接存储在对象中(因为它被多个组件使用),但宽度和高度只有保存对象位图的渲染组件才知道。我想在 GameObject 中有一个方法 getBoundingBox 或 getWidth 来获取该信息。或者一般来说,我想将一些信息从组件发送到对象。但是,在我当前的设计中,GameObject 不知道它在列表中有哪些特定组件。

我可以想到几种方法来解决这个问题:

  1. 我可以让 GameObject 拥有一些重要组件的特定字段,而不是拥有一个完全通用的组件列表。例如,它可以有一个名为renderingComponent的成员变量;每当我需要获取我刚刚使用的对象的宽度时renderingComponent.getWidth()。该解决方案仍然允许通用组件列表,但它对其中一些组件的处理方式不同,而且我担心我最终会拥有几个异常字段,因为需要查询更多组件。有些对象甚至没有渲染组件。

  2. 将所需信息作为 GameObject 的成员,但允许组件对其进行更新。因此,对象的宽度和高度默认为 0 或 -1,但渲染组件可以在其更新循环中将它们设置为正确的值。这感觉像是一种 hack,为了方便起见,我最终可能会将许多东西推送到 GameObject 类,即使并非所有对象都需要它们。

  3. 让组件实现一个接口,该接口指示它们可以查询的信息类型。例如,渲染组件将实现 HasSize 接口,该接口包括 getWidth 和 getHeight 等方法。当 GameObject 需要宽度时,它会遍历其组件,检查它们是否实现了 HasSize 接口(instanceof在 Java 或isC# 中使用关键字)。这似乎是一种更通用的解决方案,一个缺点是搜索组件可能需要一些时间(但是,大多数对象只有 3 或 4 个组件)。

这个问题不是关于特定问题的。它经常出现在我的设计中,我想知道处理它的最佳方法是什么。因为这是一个游戏,所以性能有点重要,但每个对象的组件数量通常很少(最多为 8 个)。

短版

在基于组件的游戏系统中,在保持设计通用性的同时将信息从组件传递到对象的最佳方式是什么?

0 投票
5 回答
18687 浏览

c++ - 在游戏中处理实体

作为一个小练习,我正在尝试编写一个非常小的、简单的游戏引擎,它只处理实体(移动、基本 AI 等)

因此,我正在尝试考虑游戏如何处理所有实体的更新,并且我有点困惑(可能是因为我以错误的方式进行操作)

所以我决定在这里发布这个问题,向您展示我目前的思考方式,并看看是否有人可以向我建议更好的方法。

目前,我有一个 CEngine 类,它指向它需要的其他类(例如 CWindow 类、CEntityManager 类等)

我有一个游戏循环,在伪代码中会像这样(在 CEngine 类中)

我的 CEntityManager 类看起来像这样:

我的 CEntity 类看起来像这样:

之后,我会为敌人创建类,并给它一个精灵表,它自己的功能等。

例如:

所有这些都适用于将精灵绘制到屏幕上。

但后来我遇到了使用存在于一个实体中但不存在于另一个实体中的函数的问题。

在上面的伪代码示例中,do_ai_stuff(); 和句柄输入();

从我的游戏循环中可以看出,有一个对 EntityManager->draw(); 的调用。这只是遍历 entityVector 并调用 draw(); 每个实体的功能 - 看到所有实体都有一个draw(),效果很好;功能。

但后来我想,如果它是一个需要处理输入的玩家实体怎么办?这是如何运作的?

我没有尝试过,但我认为我不能像使用 draw() 函数那样循环遍历,因为像敌人这样的实体不会有 handle_input() 函数。

我可以使用 if 语句来检查 entityType,如下所示:

但我不知道人们通常如何写这些东西,所以我不确定最好的方法。

我在这里写了很多,我没有问任何具体的问题,所以我将澄清我在这里寻找什么:

  • 我布置/设计代码的方式是否可行,是否实用?
  • 有没有更好更有效的方法来更新我的实体并调用其他实体可能没有的函数?
  • 使用枚举来跟踪实体类型是识别实体的好方法吗?
0 投票
3 回答
1531 浏览

c++ - 基于组件的游戏实体和类型检查

我正在编写一个游戏,它将使用基于组件的实体系统。我要实现的前两个组件是 EntityRepresentation 和 EntityState。表示包含动画,状态决定实体应如何对游戏事件做出反应(EntityStates 的示例:站立、跳跃、攻击、死亡、坠落)。

EntityRepresnetation 根据实体的 EntityState 决定在屏幕上绘制什么动画。如果实体处于“跳跃”状态,则会播放相应的动画。(参见 EntityRepresentation::changeAnimation() 函数。)

这大概是我写这门课的方式......

我目前的方法确实不喜欢某些东西... >:( EntityState::Id 部分。目前,EntityRepresentation 将其持有的每个动画映射到特定的 EntityState::Id。ID 对于每个类都是唯一的派生自 EntityState (类独有,而不是实例独有)。这些 ID 基本上是必须在类的构造函数中手动编写的字符串,这意味着它们很容易发生名称冲突——因为我打算使游戏可编写脚本(Python)。

有人可以给我一些建议,告诉我如何缓解我在 ID 上遇到的这个问题。我在同样使用 ID 的游戏中看到了很多基于组件的系统的实现,但我仍然不喜欢它们。它只是以错误的方式摩擦我。

也许您可以建议进行设计更改,这样 EntityRepresentation 就不必知道 EntityState 的类型,同时仍然保留封装。

0 投票
1 回答
2688 浏览

c++ - C++中的实体系统

我最近发现了实体系统架构,我在 C++ 中遇到了一些困难/理解实现。

我如何看待实体系统:

组件:具有属性、设置和获取的类。

  1. 雪碧
  2. 实体
  3. 飞船
  4. ...

System:具有组件列表的类。

  1. 项目清单
  2. 实体管理器
  3. 渲染器
  4. 输入
  5. 相机
  6. ...

实体:只是一个带有组件列表的空类。

我做了什么:

目前,我有一个允许我这样做的程序:

如果我正确理解了 EntitySystem,那么每个 System 都有自己的组件列表,可以在其中工作。(组件列表或实体列表,这就是问题)

(我把代码放在 .h 中只是为了快速调试 ^^)

问题

我想在带有 X 组件列表的系统中添加一个“T”组件

我试过的:

但我想要这样的东西:

我的 System 类是抽象的。我的系统儿童班需要有这个列表,它是自己的类型。

解决方案 :

我试图让我的 System 类有一个模板类,所以我只需要这样做:class Renderer:System

但我的 SystemManager 不喜欢这段代码:std::vector<System> systems

具有 T 类型的系统类:

系统管理器代码:

有了这个,我的 SystemManager 中出现了这个错误: “将'System'重新定义为不同类型的符号” (指向 SystemManager 中的“class System”行)

你有解决这个问题的方法吗?我的 EntitySystem 方法好吗?

谢谢!

0 投票
1 回答
3225 浏览

c++ - C++游戏引擎中的复合、组件和实体

我正在开发一个游戏的学校项目。我们使用由我们拥有的一个团队制造的引擎。引擎的构建对我来说不清楚,似乎是一种反模式。然而,似乎没有人能让我清楚地选择设计。该引擎应该使用“基于组件”的设计,但我没有看到它。下面是 Component、Composite 和 Entity 类的代码。简而言之,我的问题是:这段代码是使用有效的设计模式还是仅仅为了“实现设计模式”而过于复杂,从而导致反模式

组件.cpp:

实体.cpp

复合材料.cpp

下一段代码是 Player.cpp,它使用复合和实体作为混合类型的对象(我真的不明白逻辑)。

播放器.cpp

我根本不相信这是基于组件的设计。不应该删除实体,只使用复合和组件。组件基类不应该是空的,从不直接使用吗?就像一个名为“Rigidbody”的组件,它拥有一个用于刚体数据的数据结构和一些覆盖完全虚拟组件基类的函数?

0 投票
1 回答
902 浏览

oop - 是否有专门用于实体组件编程的语言?

我知道有用于函数式编程(LISP、Haskell 等)和 OOP 编程(Java、C#、Ruby、Python 等等)的语言,但是有没有围绕实体组件编程的概念制作的语言?

0 投票
1 回答
2851 浏览

java - 如何在 libgdx 中使用实体组件系统进行游戏设计,其中包含舞台、组和演员的整个系统?

实体组件系统能够解决游戏开发中OO编程中可能出现的规模问题。我对 ECS 有几个疑问:

概述:有些实体包括一些组件(具有数据)和具有诸如行走逻辑、战斗逻辑等逻辑的系统。因此,在任何游戏中,敌人是实体,英雄是具有自己系统的实体等。每个玩家/敌人都成为一个实体。

  1. 最初我使用舞台、组和演员,其中舞台使用层次结构将事件传递给演员,并基于我正在处理的事件。现在我有了实体,我的新演员是什么?是每个实体都会成为演员吗?如果是,那么在每个动作中,我都会调用所有组件更新函数并在绘图函数中绘制,对吗?
  2. 实体组件系统仅用于演员还是应该将其用于舞台、团体、相机?如果应该全部使用,有人可以帮助理解如何吗?

在 OO 中,这很简单,因为我在组中添加演员并根据事件将事件传递给演员,我会执行适当的任务。抱歉,如果我遗漏了什么,因为在 ECS 中思考对我来说是新的。我开始编写代码,但在考虑整个系统时我感到困惑。我知道如何为演员工作,但如何使它与团队、舞台、相机等一起工作。

0 投票
2 回答
1398 浏览

entity - Artemis 实体系统框架

我是 Artemis 实体系统框架的新手,我想知道是否有办法获取所有具有特定组件或组件的实体?(应该有,但我找不到。)

例如,我想查找所有具有 a 的实体EnemyComponent并检查它们是否与其中包含的任何实体发生冲突BulletComponent。我怎样才能做到这一点?

0 投票
2 回答
2652 浏览

box2d - 如何在 Box2D 中使用实体系统?

使用实体系统开发游戏的方法非常明确。你有组件,你将它们添加到实体中。根据您使用的组件类型,不同的系统开始处理每个实体的状态。例如,您将位置和速度组件添加到实体,而实体正在处理我的运动和碰撞系统。运动系统正在做欧拉积分(这是一个基本模型),例如:

碰撞系统说运行一些简单的碰撞算法。

现在,如果我想使用例如 Box2D 的强大功能并使用库引擎该怎么办。我应该有重复的坐标和速度,一个是位置和速度组件,另一个是 b2Body 的位置吗?我应该同步它们吗?当实体系统和物理库一起工作时,这种系统的通常方法是什么?

是否有任何使用例如 Artemis 和 Box2D 的语言的示例?