问题标签 [component-based]
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.
oop - 基于组件的游戏引擎中的通信
对于我正在制作的 2D 游戏(对于 Android),我使用的是基于组件的系统,其中 GameObject 包含多个 GameComponent 对象。GameComponents 可以是诸如输入组件、渲染组件、子弹发射组件等。目前,GameComponents 拥有对拥有它们的对象的引用并可以对其进行修改,但 GameObject 本身只有一个组件列表,它并不关心组件是什么,只要在对象更新时可以更新它们即可。
有时一个组件有一些 GameObject 需要知道的信息。例如,对于碰撞检测,游戏对象向碰撞检测子系统注册自己,以便在它与另一个对象碰撞时得到通知。碰撞检测子系统需要知道对象的边界框。我将 x 和 y 直接存储在对象中(因为它被多个组件使用),但宽度和高度只有保存对象位图的渲染组件才知道。我想在 GameObject 中有一个方法 getBoundingBox 或 getWidth 来获取该信息。或者一般来说,我想将一些信息从组件发送到对象。但是,在我当前的设计中,GameObject 不知道它在列表中有哪些特定组件。
我可以想到几种方法来解决这个问题:
我可以让 GameObject 拥有一些重要组件的特定字段,而不是拥有一个完全通用的组件列表。例如,它可以有一个名为renderingComponent的成员变量;每当我需要获取我刚刚使用的对象的宽度时
renderingComponent.getWidth()
。该解决方案仍然允许通用组件列表,但它对其中一些组件的处理方式不同,而且我担心我最终会拥有几个异常字段,因为需要查询更多组件。有些对象甚至没有渲染组件。将所需信息作为 GameObject 的成员,但允许组件对其进行更新。因此,对象的宽度和高度默认为 0 或 -1,但渲染组件可以在其更新循环中将它们设置为正确的值。这感觉像是一种 hack,为了方便起见,我最终可能会将许多东西推送到 GameObject 类,即使并非所有对象都需要它们。
让组件实现一个接口,该接口指示它们可以查询的信息类型。例如,渲染组件将实现 HasSize 接口,该接口包括 getWidth 和 getHeight 等方法。当 GameObject 需要宽度时,它会遍历其组件,检查它们是否实现了 HasSize 接口(
instanceof
在 Java 或is
C# 中使用关键字)。这似乎是一种更通用的解决方案,一个缺点是搜索组件可能需要一些时间(但是,大多数对象只有 3 或 4 个组件)。
这个问题不是关于特定问题的。它经常出现在我的设计中,我想知道处理它的最佳方法是什么。因为这是一个游戏,所以性能有点重要,但每个对象的组件数量通常很少(最多为 8 个)。
短版
在基于组件的游戏系统中,在保持设计通用性的同时将信息从组件传递到对象的最佳方式是什么?
c++ - C++中的实体系统
我最近发现了实体系统架构,我在 C++ 中遇到了一些困难/理解实现。
我如何看待实体系统:
组件:具有属性、设置和获取的类。
- 雪碧
- 实体
- 飞船
- ...
System:具有组件列表的类。
- 项目清单
- 实体管理器
- 渲染器
- 输入
- 相机
- ...
实体:只是一个带有组件列表的空类。
我做了什么:
目前,我有一个允许我这样做的程序:
如果我正确理解了 EntitySystem,那么每个 System 都有自己的组件列表,可以在其中工作。(组件列表或实体列表,这就是问题)
(我把代码放在 .h 中只是为了快速调试 ^^)
问题
我想在带有 X 组件列表的系统中添加一个“T”组件
我试过的:
但我想要这样的东西:
我的 System 类是抽象的。我的系统儿童班需要有这个列表,它是自己的类型。
解决方案 :
我试图让我的 System 类有一个模板类,所以我只需要这样做:class Renderer:System
但我的 SystemManager 不喜欢这段代码:std::vector<System> systems
。
具有 T 类型的系统类:
系统管理器代码:
有了这个,我的 SystemManager 中出现了这个错误: “将'System'重新定义为不同类型的符号” (指向 SystemManager 中的“class System”行)
你有解决这个问题的方法吗?我的 EntitySystem 方法好吗?
谢谢!
c++ - C++游戏引擎中的复合、组件和实体
我正在开发一个游戏的学校项目。我们使用由我们拥有的一个团队制造的引擎。引擎的构建对我来说不清楚,似乎是一种反模式。然而,似乎没有人能让我清楚地选择设计。该引擎应该使用“基于组件”的设计,但我没有看到它。下面是 Component、Composite 和 Entity 类的代码。简而言之,我的问题是:这段代码是使用有效的设计模式还是仅仅为了“实现设计模式”而过于复杂,从而导致反模式?
组件.cpp:
实体.cpp
复合材料.cpp
下一段代码是 Player.cpp,它使用复合和实体作为混合类型的对象(我真的不明白逻辑)。
播放器.cpp
我根本不相信这是基于组件的设计。不应该删除实体,只使用复合和组件。组件基类不应该是空的,从不直接使用吗?就像一个名为“Rigidbody”的组件,它拥有一个用于刚体数据的数据结构和一些覆盖完全虚拟组件基类的函数?
oop - 是否有专门用于实体组件编程的语言?
我知道有用于函数式编程(LISP、Haskell 等)和 OOP 编程(Java、C#、Ruby、Python 等等)的语言,但是有没有围绕实体组件编程的概念制作的语言?
java - 如何在 libgdx 中使用实体组件系统进行游戏设计,其中包含舞台、组和演员的整个系统?
实体组件系统能够解决游戏开发中OO编程中可能出现的规模问题。我对 ECS 有几个疑问:
概述:有些实体包括一些组件(具有数据)和具有诸如行走逻辑、战斗逻辑等逻辑的系统。因此,在任何游戏中,敌人是实体,英雄是具有自己系统的实体等。每个玩家/敌人都成为一个实体。
- 最初我使用舞台、组和演员,其中舞台使用层次结构将事件传递给演员,并基于我正在处理的事件。现在我有了实体,我的新演员是什么?是每个实体都会成为演员吗?如果是,那么在每个动作中,我都会调用所有组件更新函数并在绘图函数中绘制,对吗?
- 实体组件系统仅用于演员还是应该将其用于舞台、团体、相机?如果应该全部使用,有人可以帮助理解如何吗?
在 OO 中,这很简单,因为我在组中添加演员并根据事件将事件传递给演员,我会执行适当的任务。抱歉,如果我遗漏了什么,因为在 ECS 中思考对我来说是新的。我开始编写代码,但在考虑整个系统时我感到困惑。我知道如何为演员工作,但如何使它与团队、舞台、相机等一起工作。
c++ - 创建包含未知模板类型列表的库
不久前,我开始创作游戏,并遇到了我真正喜欢的风格。它被称为基于组件的架构。本教程适用于 Objective-C,而不是 C++,但无论如何我都包含了链接: http ://www.raywenderlich.com/24878/introduction-to-component-based-architecture-in-games
我注意到我正在从一个项目到另一个项目复制和粘贴大量代码,所以我决定只为通用框架创建一个库。通常,组件包含在实体对象中,如下所示:
由于我的库将包含通用框架,而不是单个组件,因此此方法不再适用。相反,我创建了一个ComponentManager
类来管理我的组件。目前,实体如下所示:
我还没有定义这些函数,所以我没有包含实现文件。
ComponentReference
struct 只是用于定位特定组件的整数和字符串的集合。实体会将 a 传递ComponentReference
给 in 的模板化函数manager
,该函数将在其内部列表中搜索特定对象。还有砖墙。我不知道如何创建一个列表,其中包含未知数量的不同未知类型的对象。它们是从父类派生的Component
,但它们都包含不同的函数和成员变量。我尝试使用指针数组和类型转换,但三个小时后,当我读到过度依赖类型转换是代码编写错误的指标时,我放弃了。
我尝试使用 STL 容器,但它们只需要一种类型,因此显然它们不起作用(带有指向模板类的指针的 C++ std::vector)
我看到了一些关于包装器的东西,但从我读到的,它们似乎只适用于函数:(c++ 存储一个指向未知类成员函数的指针)如果它们可以用来解决我的问题,请解释它们是如何工作的(我'在今天之前从未听说过他们)
由于这是我的第一个问题,请随时留下反馈。我做了研究,但如果这是重复的,我很抱歉。我对 C++ 并不陌生,但我也不是专家,而且它是一门大语言,所以我可能会要求澄清。提前致谢!
c# - 关于 IoC/DI VS CBSE 的信息
关于 IoC 和 CBSE 之间的差异,我有几个问题我一辈子都找不到。
我已经使用 IoC/DI 很长一段时间了,特别是在 PHP 中使用 Laravel,所以我认为我对它的工作原理和使用方法有了很好的了解。我最近购买了 George T. Heineman 的《基于组件的软件工程》一书。当谈到组件如何与其他组件通信时,我遇到了一些困惑,因此开始进行一些在线研究。我专门查找 C# 示例,据我所知,CBSE 与 Ioc/DI 非常相似,在某些情况下,我经常想知道人们是否只是把它称为错误的东西。
我在阅读本书时看到的最大区别不是注入依赖关系,而是更加线性,并且在您的界面中告诉它您想要使用哪个类。我觉得好像我完全偏离了基础,错过了 CBSE 的全部要点,但找不到任何让我兴奋的信息。任何人都可以提供一些可以解决这个问题的信息吗?
小更新:
如果我理解正确,CBSE 背后的想法听起来真的很棒。但是我对组件如何相互通信感到困惑。如果我理解正确,组件不应该知道任何其他组件。因此,虽然为所有事情抛出事件都有效,但只有在需要信息的组件知道或期望有 x 个组件抛出该事件时才有效。
我试图解决这个问题有几个原因。看看这是否是我想学习并开始用于我作为应用程序程序员的工作以及我对游戏编程的爱好的路线。我是通过研究游戏编程来了解 CBSE 的。
xna - 游戏对象中的数据存储
我目前正在使用 XNA 构建游戏,我目前的游戏对象组件设置如下:
等等。自从制作菜单系统以来,我一直在玩数据容器类型的对象,比如我有一个 DataContainer 的基类,然后是 IntContainer、FloatContainer 等子类。根据它们的子类,它们返回它们包含的数据类型。我想将此菜单系统连接到组件,以便我可以轻松编辑它们,我想知道是否应该更改我的组件以也采用这种保存通用数据容器而不是显式类型数据的模型,就像这样:
我可以像上面一样保留适当命名的方法,因此在代码中按名称获取值仍然很简单。将我的引擎换成这种数据存储方法需要一些工作,所以我想知道是否有人输入过,更通用的方法是否会以任何可衡量的方式影响性能?调用两种方法获取值是否比直接获取值更糟糕?
java - 基于组件的游戏对象的数组和映射之间的优缺点
我的基于组件的游戏引擎的抽象实现GameObject
如下:
游戏对象
- 唯一身份
- isActive 标志
- 组件数组
我一直在阅读有关基于组件的设计,引起我注意的一件事是由于缓存,数组的线性遍历很快,所以这让我决定使用基本数组来保存实体/游戏对象。
现在引起我注意的另一件事是一些资源将组件与游戏对象分开。相反,他们所做的是在实体管理器中放置一个地图。该地图将游戏对象作为键,将一组组件作为值。在这种情况下,AGameObject
只有一个 ID。
将游戏对象附加到组件而不是在类中包含组件是否有优势(性能和/或设计方面)GameObject
?
另外,GameObject
s 会从一个Pool
对象中池化(回收),以避免频繁的内存分配。
c++ - 比较 C++ 中的类型
我正在开发一个自定义引擎,其中有 2 个不同的变换类,一个用于 2D,一个用于 3D。我正在使用#define 来选择要使用的转换类,并在逻辑应该相同的地方使用该定义而不是类名。我现在正处于一个我希望他们有不同逻辑的地方,并想做一个比较来分支。我需要做什么才能使其正常工作?
类型 id 为此工作。你怎么处理?