
FXGL 加载 .tmx 地图文件失败(如 Asset not found: tutorial.tmx)通常源于资源路径未被正确识别或 Java 9+ 模块系统限制了资源访问,关键需确保资源位于 src/main/resources/ 下且模块声明为 open。
fxgl 加载 `.tmx` 地图文件失败(如 `asset not found: tutorial.tmx`)通常源于资源路径未被正确识别或 java 9+ 模块系统限制了资源访问,关键需确保资源位于 `src/main/resources/` 下且模块声明为 `open`。
在 FXGL 项目中,.tmx 文件(由 Tiled 编辑器导出的地图)属于运行时资源,而非源代码,因此必须放在 Maven 标准资源目录中:
✅ 正确路径:
src/main/resources/tutorial.tmx src/main/resources/assets/images/... // 可选:关联的图块集(.png)、属性文件等
❌ 常见错误路径(会导致 Asset not found):
-
src/main/java/tutorial.tmx(Java 源码目录,不参与资源打包) -
src/main/resources/maps/tutorial.tmx(路径正确但加载时未带子目录)→ 若放在此处,应调用FXGL.setLevelFromMap("maps/tutorial.tmx")
同时,FXGL 依赖反射读取资源(尤其解析 TMX 中的图像、属性等),在启用 Java 模块系统(即存在 module-info.java)时,必须将模块声明为 open,否则 JVM 会阻止运行时对资源的深层访问:
// module-info.java —— 必须添加 'open' 关键字
open module your.game.module.name {
requires javafx.controls;
requires javafx.fxml;
requires com.almasb.fxgl.all;
// 导出主类包(如需要)
exports com.yourname.game;
}
⚠️ 注意:
open module是强制要求。仅写module ... { }会导致FXGL.setLevelFromMap()内部无法通过Class.getResourceAsStream()安全读取.tmx及其引用的图块图像(.png),最终抛出Asset not found或NullPointerException。
验证步骤:
- 清理并重建项目:
mvn clean compile - 检查生成的 JAR 中是否包含
tutorial.tmx:jar -tf target/your-app.jar | grep tutorial.tmx - 确保 Tiled 导出
.tmx时,“Embed tileset” 未勾选(推荐使用外部图块集),且图块图像路径(如assets/tiles/grass.png)也置于src/main/resources/对应位置。
总结:FXGL 的资源加载严格遵循 Maven 资源约定 + Java 模块开放策略。只要 .tmx 放在 src/main/resources/ 根目录(或子目录并同步更新路径字符串),且 module-info.java 以 open module 开头,FXGL.setLevelFromMap("tutorial.tmx") 即可稳定工作。










