FXGL加载TMX地图报No EntityFactory has a method annotated @Spawns()问题求助
FXGL加载TMX文件报错排查方案
- 第一步:处理Tiled版本兼容问题
报错明确提示当前TMX由Tiled 1.7.2生成,FXGL当前支持的最高版本为1.2.3,高版本新增的属性会导致解析异常。请卸载现有Tiled,安装1.2.3版本后重新导出TMX文件,导出时选择未压缩的XML格式,不要开启任何压缩选项。 - 第二步:补全实体工厂的必要注解
FXGL要求自定义的实体工厂类必须添加类级别的@EntityFactory注解,才能正确扫描到方法上的@Spawns注解。你当前的SimpleEntityFactory类缺少该注解,是触发报错的核心原因。
修正后的实体工厂代码如下:import com.almasb.fxgl.entity.Entity; import com.almasb.fxgl.entity.EntityFactory; import com.almasb.fxgl.entity.SpawnData; import com.almasb.fxgl.entity.Spawns; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import static com.almasb.fxgl.dsl.FXGL.entityBuilder; @EntityFactory public class SimpleEntityFactory implements EntityFactory { @Spawns("tree") public Entity newTree(SpawnData data) { return entityBuilder(data) .view(new Circle(8, Color.BLUE)) .build(); } } - 第三步:调整实体工厂的注册时机
实体工厂必须在加载TMX地图之前完成注册,建议将注册逻辑从initGameVars迁移到initGame方法的最开头,确保执行顺序正确:@Override protected void initGame() { FXGL.getGameWorld().addEntityFactory(new SimpleEntityFactory()); FXGL.setLevelFromMap("level01.tmx"); } // 原initGameVars中的注册代码可以直接删除 - 第四步:检查配置一致性
- 确认TMX文件中object的
name属性值和@Spawns注解中的值完全一致,无大小写差异、多余空格 - 确认TMX文件放置在项目的
assets/levels目录下,路径拼写完全匹配
- 确认TMX文件中object的
- 第五步:定位问题范围
可以临时删除TMX中的对象层(objectgroup),尝试仅加载瓦片层,如果能正常加载即可确认问题出在实体工厂相关配置,和瓦片层无关。
内容的提问来源于stack exchange,提问作者Arquillian
相关产品推荐
相关产品推荐

