问题标签 [artemis]

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 投票
2 回答
1398 浏览

entity - Artemis 实体系统框架

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

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

0 投票
2 回答
2652 浏览

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

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

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

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

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

0 投票
1 回答
495 浏览

c# - 什么是阿尔忒弥斯池?

Artemis 似乎是一个出色的 ECS 框架,但至少可以说缺乏文档。我是 ECS 新手,不知道自己在做什么,但我想学习。

我的目标是在屏幕上画一些东西。我正在使用 MonoGame 和 Visual Studio 2012(与 Artemis)。我花了很多时间浏览 StarWarrior 代码,但没有任何成功。我找不到 SpatialFormComponent 和我想要绘制的东西(例如 PlayerShip)之间的链接。

我对这个问题的最佳猜测是我错误地使用了游泳池。所以我的两个问题:

1. 什么是阿尔忒弥斯的游泳池?(AddComponentFromPool() 有什么作用?)

2. 如何使用 Artemis 在屏幕上绘制一些东西?(缺少的链接是什么?)

如果这个问题似乎没有得到很好的研究,我很抱歉,但我向你保证它是。话虽如此,如果您找到解决我问题的来源(我怀疑您会),那么我欢迎反对。

0 投票
1 回答
103 浏览

c# - EntityProcessingSystem 不能与类型参数一起使用

我正在使用 Artemis 并尝试扩展EntityProcessingSystem<SpatialForm, Transform>. 但是,它告诉我The non-generic type 'Artemis.System.EntityProcessingSystem' cannot be used with type arguments;但是,它必须与类型参数一起使用。知道这里发生了什么吗?

我正在使用 Artemis - https://github.com/thelinuxlich/artemis_CSharp 和 StarWarrior 作为我的教程 - https://github.com/thelinuxlich/starwarrior_CSharp

0 投票
2 回答
1986 浏览

java - 用于与 artemis 一起使用的瓦片地图的数据结构

我一直在使用artemis-odblibGDX 开发基于回合的瓷砖地图游戏。

我想要地图的不同地形类型,例如草、沙、水、山脉等,这些不同的地形类型中的每一种都有不同的移动成本和与游戏相关的各种附加属性。

我目前正在考虑几种不同的方法:

  1. 我可以使地图成为一个系统GameMapSystem,并让每种类型的地形由一个实体表示,并具有每种地形的相关组件(例如TerrainStats,偶尔会出现拼写效果组件Exploding)。我主要关心的是如何管理瓷砖到地形类型实体的映射。从概念上讲,这应该像使用int[][]与地形实体的 id 对应的值一样容易维护,但是在这种情况下,临时标记组件 ( Exploding) 将一次附加到所有给定的地形类型。这似乎不太理想。那么我需要为每个图块设置一个单独的实体吗?如果我这样做,我不会为实体框架创建额外的开销吗?

  2. 我还考虑过制作游戏地图和地形类型 POJOS,然后简单地使用标记组件创建标记实体以实现特殊效果。然而,这样做,看起来我会随意传递GameMap对象,以便让各种系统能够处理它(用于渲染、碰撞、路径等)。此外,我的游戏地图是否还需要在任何给定时间跟踪地图上的实体及其位置以执行我的路径逻辑?如果可能的话,我更愿意将实体的管理完全保留在实体框架的范围内,因为这意味着维护会稍微容易一些。

我很好奇是否有任何我尚未研究过的方法。否则我会倾向于方法#2,除非有某种方法可以修复我忽略的方法#1。

0 投票
3 回答
3582 浏览

data-modeling - 对 CPU 缓存友好的实体组件系统框架

我找不到一个对 CPU 缓存友好的框架实现,这意味着系统在每个游戏循环周期中遍历的数据都存储在连续的内存中

Let's see, systems traverse on specific entities that satisfy their conditions, i.e. the entity should contain A, B, C components to be processed by X system. This means that I need a contiguous memory that contains all entities and components (not references, as far as references are not cache friendly, and you will have lots of cache misses) in order to obtain them from RAM as much fast as it is possible during the processing of X system. But right after the processing of X system, Y system starts to operate on a set of entities that satisfy to its conditions e. g.all entities containing A and B. This means that we deal with the same set of entities as X system plus some other entities that have A and B. This means that we have two contiguous memories which have duplicate data. First of all data duplication is very bad for known reasons. And also this, in its turn, means that we need a synchronization, which again is not CPU cache friendly as far as you need to find some entities from one vector and update with the new data which is contained in another vector.

This is just one of my thoughts. There are other, more realistic, thoughts for Entity Component System Framework data model, but in each model I could figure out there is the same problem: during each game loop cycle you can not prevent lots of cache misses because of not contiguous data.

Can anyone please suggest an implementation, article, example just something on this topic, that can help me understand what data model should be used to obtain cache friendly design, as this is one of the most critical things in game performance.

0 投票
1 回答
87 浏览

java - 将 Artemis ESF 与 JRuby 结合使用

我正在尝试使用 JRuby 的Artemis 实体系统框架。这是我试图转换为 JRuby 的 Java 代码:

当我执行这个输出是:

ConsoleOutputSystem.process() 方法被调用十次。这是我的 JRuby 代码:

输出是:

所以 ConsoleOutputSystem 构造函数被调用,而不是 ConsoleOutputSystem.process()。我尝试同时使用 @world.initialize 和 @world.java_send :initialize 并且输出是相同的。我尝试的另一件事是将 java_signature 'protected void process(Entity)' 添加到 ConsoleOutputSystem.process() 方法中。

Artemis 包中的其他几个类具有名为 initialize() 的受保护方法,但我不确定这是否与我的问题有关。

[编辑]

自从我发布问题以来,我已经取得了一些进展。@world.java_send :initialize 有效并调用了正确的方法。不起作用的是 Aspect.get_aspect_for_all()。在 Java 中 Aspect.getAspectForAll() 期望

作为论据。在 JRuby 中,这些都不能作为 Aspect.getAspectForAll() 的参数:

唯一可行的是预先创建一个 Position 实例并将其类传递给 Aspect.getAspectForAll():

这是它工作的代码,但感觉就像一个杂物:

的输出

是:

所以,我的问题是如何在不创建 Position 类的实例的情况下访问 org.jruby.proxy.com.artemis.Component$Proxy0 ?

[编辑 2]

感谢 Namek 在这里的回答是有效的代码。它用

所以我不需要创建一个 JRuby 类的实例来访问它的 Java 类:

0 投票
3 回答
397 浏览

libgdx - 基于实体系统的游戏中的关卡部分变化

我目前正在使用 artemis 和 libgdx 开发基于实体系统的游戏,我想知道在这种配置中我应该如何处理级别更改。

例如,对于类似马里奥的平台游戏:

首先马里奥启动关卡,引擎实例化一个新的 World() 加载 tilemap 并初始化所有对象。

如果马里奥穿过管道怎么办?管道内的世界是一个新的世界()?还是相机只专注于世界的另一部分?

如果我们有一个新世界,artemis 不允许从世界中分离实体,那么我可以克隆玩家实体并将其添加到新世界吗?

有人知道如何处理这种级别的部分变化(马里奥的部分/安倍的奥德赛屏幕)吗?使用类似 artemis 的框架来实现这一目标的常用方法是什么?

0 投票
1 回答
1457 浏览

clickonce - ClickOnce 部署 AppData\Local\Temp FileNotFoundException 后出现异常

单击一次安装后,我得到了这个异常。系统中的大多数用户都不会收到此错误,并且应用程序运行正常。有少数用户遇到此错误。他们安装在什么机器上并不重要。

我感觉这是一个组策略问题。任何帮助表示赞赏。

详细信息:找不到文件'C:\Users\USERNAME\AppData\Local\Temp\Deployment\Q4NW1PKL.OT1\A740DGRA.6EL\MyHelperEXEFile.exe'.

堆栈跟踪:

更新 - 已解决

在事件查看器中调查应用程序事件后,发现 McAfee 在单击一次执行安装时删除了此文件。声称它有病毒。阿尔忒弥斯木马

community.mcafee.com/thread/2016

一旦 McAfee 被禁用,我就能够完成安装。

0 投票
1 回答
316 浏览

c# - 在monogame或xna中使用Artemis添加鼠标单击矩形的首选方式或地点是什么

使用 Artemis、Visual Studio、C# 和 Monogame。

刚开始了解 Artemis,但在寻找合适的位置向实体添加可点击的矩形/区域时,屏幕上将出现多个实体。

基本简单的想法,我在 2D 游戏区域中随机显示和移动小方形精灵。我需要能够点击它们并保持简单,删除方块。

在 Artemis 中,您拥有组件、实体、系统。

我知道我会将这个矩形区域添加到 Texture2D 正方形中,猜测它应该是它自己的组件。

试图弄清楚

  1. 得到正方形大小的矩形,移动时与正方形保持一致。
  2. 如何在某些系统中检测到该方块被点击或触摸。

更新

在我的 DrawableGameComponent 实体中。DrawPosition 是一个 vector2 并在主游戏例程中设置。这是我的广场的位置。我使用它和纹理大小来计算我的矩形的大小和位置。

AreItemsIntersecting 函数将在单击屏幕时占据鼠标位置,然后我用它来创建一个小矩形,然后检查 2 是否相交。如果他们这样做,那么该对象被单击。