FXGL17 - 实体Entity

214 阅读2分钟

PS:禁止拷贝形式转载,转载请以URL形式

PS:FXGL 准备写成一个系列,所以在该系列未完成前,该系列文章除了目录会被修改其他内容均可能被删改。

1. 简介

Entity 可以看成一个容器可以包含一系列 Component 集合,根据开发者创建的不同 Entity 就可以表达在FXGL 游戏引擎中展示不同效果,本章讲解如何在FXGL中去操作管理实体

2. 管理实体

  • build():表示创建实体
  • buildAndAttach():表示创建并且添加实体到游戏世界
@Override
protected void initGame() {
    // -----------------------  一般写法

    //创建实体
    Entity entity =  FXGL.entityBuilder()
            .view(new Rectangle(20, 20, Color.BLUE))
            .at(200,200)
            .build();

    //添加实体
    FXGL.getGameWorld().addEntity(entity);

    //2S后删除实体
    FXGL.runOnce(entity::removeFromWorld, Duration.seconds(2));

    // -----------------------  简要写法
    FXGL.entityBuilder()
          .view(new Rectangle(20, 20, Color.BLUE))
          .at(200,200)
          //添加一个过期组件,2S自动清楚该组件
          .with(new ExpireCleanComponent(Duration.seconds(2)))
          //创建后并添加到世界
          .buildAndAttach();
}

3. EntityFactory管理实体

  • @Spawns("entity,entity1"):多个名称可以用逗号隔开,表示entity,entity1这两个名称都可以用来创建同一个实体
@Override
protected void initGame() {
    //添加工厂
    FXGL.getGameWorld().addEntityFactory(new CustomEntityFactory());
    //普通写法
    //Entity entity1 = FXGL.getGameWorld().create("entity",new SpawnData(200,200));
    //FXGL.getGameWorld().addEntity(entity1);
    //简要写法
    FXGL.spawn("entity", 300, 200);
}

public class CustomEntityFactory implements EntityFactory {
    //注解的名称和创建时传递的名称对应
    @Spawns("entity")
    //@Spawns("entity,entity1")
    public Entity newEntity(SpawnData spawnData) {
        return FXGL.entityBuilder(spawnData)
                .with(new ExpireCleanComponent(Duration.seconds(2)))
                .view(new Rectangle(20, 20, Color.GREEN))
                .build();
    }
}

3.1 SpawnData参数传递

  • new SpawnData():可以看成一个MAP,创建时可以自定义内容然后传递给工厂方法进行取值
@Override
protected void initGame() {
    FXGL.getGameWorld().addEntityFactory(new CustomEntityFactory());
    //传递一个time 属性,控制其删除时间
    FXGL.spawn("entity",new SpawnData(200,200).put("time",2));
}

public class CustomEntityFactory implements EntityFactory {
    @Spawns("entity")
    public Entity newEntity(SpawnData spawnData) {
        //获取time 属性
        int time = spawnData.get("time");
        return FXGL.entityBuilder(spawnData)
                .with(new ExpireCleanComponent(Duration.seconds(time)))
                .view(new Rectangle(20, 20, Color.GREEN))
                .build();
    }
}

4. 效果演示

1.gif