Libgdx 在ECS中的系统之间共享数据(Ashley)

Libgdx 在ECS中的系统之间共享数据(Ashley),libgdx,entity,Libgdx,Entity,我目前正在重组我的LibGDX项目,以适应使用Ashley的ECS结构。 目前,我有以下系统结构: 输入系统(处理播放器输入) PhysicSystem(将速度应用于实体,执行碰撞检测并移动它们) CameraSystem(将相机调整到相机焦点) 渲染系统(使用摄影机信息转换SpriteBatch并绘制所有实体) 现在我知道每个系统都应该包含它所需要的所有逻辑,并且被封装以减少复杂性。 但是我需要相机系统中的相机来调整它,我需要它在渲染系统中应用相机变换,我需要它在输入系统中查看鼠标指向的位

我目前正在重组我的LibGDX项目,以适应使用Ashley的ECS结构。 目前,我有以下系统结构:

  • 输入系统(处理播放器输入)
  • PhysicSystem(将速度应用于实体,执行碰撞检测并移动它们)
  • CameraSystem(将相机调整到相机焦点)
  • 渲染系统(使用摄影机信息转换SpriteBatch并绘制所有实体)
现在我知道每个系统都应该包含它所需要的所有逻辑,并且被封装以减少复杂性。 但是我需要相机系统中的相机来调整它,我需要它在渲染系统中应用相机变换,我需要它在输入系统中查看鼠标指向的位置。您如何使用ECS方法解决这个问题?系统可以相互通信吗?我是否应该使用一个名为“SharedData”的单例程序,在其中转储多个系统需要的所有内容?我觉得有点难看


提前感谢:)

是的,使用单例将首先挫败使用ECS的目的。在ECS中,使用的方法是使用实体表示所有共享数据。拥有一个
实体
类型是非常好的,在游戏的生命周期中,该实体只有一个实例

整个系统
被添加到
引擎时,可以直接从
引擎
访问这些。另一种方法是,如果经常访问,则将通常访问的实体传递给系统的构造器,过去我曾将此方法用于传递Box2D
World
实体

我相信我的代码在解释我的推理方面做得更好,所以你可以看看我以前使用Ashley的一个游戏


另外,我的项目还包括一个事件队列,用于不同实体系统之间的消息传递(在不传递数据的情况下,所有数据仍然封装在
entity
类中),我发现这非常有用

我通常在游戏中使用云服务器的vis运行时。在vis运行时中,一个系统被注入另一个系统,以便可以轻松访问另一个系统。根据我的说法,你可以将摄像系统共享给其他系统。太棒了,我将深入研究你的代码,看看你是如何管理这一切的。赛事系统听起来也是个好主意