Zay-ES起步

获取Zay-ES类库

Zay-ES 最新的发布版本的下载地址 :Releases

Zay-ES是一个非常轻量的实体组件系统(ECS)框架,一共包含2个 jar 文件。

  • zay-es-版本号.jar Zay-ES 框架的核心模块。
  • zay-es-net-版本号.jar Zay-ES 框架的网络模块。

注意:如果你并不打算开发网络游戏,或者不打算在网络模块中使用 Zay-ES 框架,就不需要 zay-es-net-版本号.jar 这个文件。

你也可以使用 gradle/maven/ivy 等自动编译工具来配置 Zay-ES 类库。Zay-ES 的jar文件已经上传到了 jCenter 公共仓库中。

下面是在 build.gradle 文件中添加 Zay-ES 类库的例子:

dependencies {
    compile "com.simsilica:zay-es:1.2.1"
    compile "com.simsilica:zay-es-net:1.2.1"
}

依赖

如果你是直接下载 Zay-ES 框架的jar文件,而非使用现代的自动化编译工具,那就得自己额外下载 Zay-ES 框架所依赖的其他jar文件:

  • Guava 12.0 或 更高版本。
  • slf4j 1.7.5 或 更高版本,以及一个你喜欢的logging框架适配器。(至少需要 slf4j 的 API 文件,例如:slf4j-api-1.7.5.jar

Zay-ES 基本使用方法

创建 EntityData 核心对象

EntityData 是整个 Zay-ES 系统的关键接口,它会记录所有的组件数据。实例化 EntityData 的最少代码如下:

EntityData ed = new DefaultEntityData();

DefaultEntityData 将把组件数据保存在内存中,适用于单机游戏。

创建一个实体(Entity)

通过调用 EntityData 接口的 createEntity() 方法来创建实体。创建实体时,实际上会生成一个新的 EntityId,用于关联各种组件。

EntityId myEntity = ed.createEntity();

设置组件(Componenet)

Zay-ES框架中的 EntityComponent 是一个接口,通常来说,你应该根据程序的需要来创建具体的实现类。不过 Zay-ES 框架提供了几个常用的“标准”组件,下面的代码说明了如何给刚才创建的实体设置 Name 组件。

ed.setComponent(myEntity, new Name("My Entity"));

监听变化(主循环)

Zay-ES 与 其他 ECS 框架最大的一个不同之处,在于它并不强制你去实现特别的system 模型。很多 ECS 系统都采用 IOC 模式,你负责实现 System 接口,然后 ECS 框架负责调用各个系统。使用 Zay-ES 时,如何实现系统模块,以及如何使用实体数据,都可以根据你的意愿来编写。你可以在任何时候主动查询实体数据,Zay-ES 的内部机制将保证这种用法的执行效率。

下面是一个基本的轮循:

EntitySet namedEntities = ed.getEntities(Name.class);
while( true ) {
    namedEntities.applyChanges();
    for( Entity e : namedEntities ) {
        // 做点什么
    }
}

下面是一种更高效的轮循方式:只在实体数据发生改变时才执行逻辑代码:

EntitySet namedEntities = ed.getEntities(Name.class);
while( true ) {
    if( namedEntities.applyChanges() ) {
        // 对那些刚加入的实体进行操作
        addSomeStuff(namedEntities.getAddedEntities());

        // 对那些已经消亡的实体进行操作
        removeSomeStuff(namedEntities.getRemovedEntities());

        // 对那些被修改过的实体进行操作
        changeSomeStuff(namedEntities.getChangedEntities());
    }
}

想要更加详细地了解 Zay-ES 框架,请继续阅读后续文章。