实体系统框架中的图块地图?


12

我一直在阅读实体系统框架,尤其是Artemis。我正在尝试确定是否适合我。我严格从事基于图块的2d像素艺术游戏,而且我认为它们永远不会占用大量资源。过去,我一直使用标准OOP进行大量继承。

我现在对实体系统框架的理解(我不确定是否完全掌握):

  • 实体不过是ID的
  • 组件不过是添加到实体组件池中的哑数据
  • 系统是附加到世界的更新功能,用于处理与系统组件签名匹配的每个实体

如果我的理解是正确的,那么在概念上很难在此框架中添加图块图和AI行为树。我将来会问有关AI的问题。

是否应在此框架中内置图块地图?还是应该将其分开放置以使其易于使用tilemap编辑器生成?

如果应该将tilemap内置到此框架中,那么每个tile都是不同的实体吗?和tilemap一个系统?还是tilemap本身就是继承了继承关系的单个实体?

如果tilemap足够精细,那么与外部tilemap碰撞检测实体的最佳方法是什么?

我了解我列出的多个选项可能是正确的,但是如果有人过去这样做过,他们也许可以使我感到困惑。也许还有我没有想到的另一种选择?

谢谢。


X / Y坐标是完全随机的音符,也可用作ID。我并不是建议您在实体系统中实现它,而是可以像在实体系统中一样将效果附加到图块上。
William Mariager

嘿,只是传递了Byte56的建议:组件实际上并不需要是笨拙的数据持有者。有时,如果他们可以实际操作该数据将很有用;向量。
jcora 2012年

我也很喜欢这个建议。我可以将tilemap添加到实体框架中,而不必将tilemap帮助器与数据分开,也不必将tilemap分解为多个组件/实体。
Spencer Marr

Tilemap只是另一个组件,碰撞系统和渲染器系统处理与tilemap的碰撞和tilemap的渲染
Kikaimaru 2012年

Answers:


8

在开发了一段时间之后,我实现了一个实体组件框架(类似于Artemis),但是我认为如果从空白开始,我做的事情不会有所不同。

我的世界与实体框架完全分开。将世界转换为某种实体或实体集合对我而言没有任何意义。我的世界是带有立方体的3D,但我相信瓷砖也一样。实体构成了世界上所有其他事物,但是地形却是分开的。但是,删除多维数据集后,它们会生成“物质”实体。

碰撞检测并不是很困难。您的世界很可能会有isSolidAt(x,y)碰撞系统将要使用的类型方法。诚实,今天我已经用不同的答案说过一次,做对您来说最有意义的事情。通过将磁贴图分开或使其成为实体,不会违反任何规则。可以包住头的任何东西都是最好的。对我来说,那是使世界分离并使其他所有实体成为实体。


1
说我的地图实体。另一个实体将如何使用地图的isSolidAt方法?
2013年

对于这种情况,将地图存储为实体可能不是一个好主意。我想在这种情况下,您必须直接与之沟通。负责地图实体的系统将有权访问地图实体,并且能够在被请求时从该实体检索信息。
MichaelHouse

4

我将tilemap作为单独的组件添加到了实体(所有图块都在其中),并且还有单独的图块渲染器,因此我可以在3d或2d中对其进行渲染。将所有图块创建为实体是可能的,但代价昂贵。

像这样的东西:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

将图形与逻辑分离的好处是MVC模式的基本思想


1
整个图块都包含在一个组件中?它是否附在某种游戏环境实体/主实体上?通过将渲染器与tilemap组件分离,我可以看到很大的好处。
Spencer Marr

感谢您更新答案!我喜欢代码片段。
Spencer Marr
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.