LibGDX 无法解析 tmx 文件:找不到文件

LibGDX could not parse tmx file: file not found

我正在尝试使用 LibGDX 和 Eclipse 显示等距平铺地图。

但是,当 运行 进行项目时,我遇到了这个错误:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.SerializationException: Error parsing file: E:/Documenti/eclipseiso/desktop/map.tmx
at com.badlogic.gdx.utils.XmlReader.parse(XmlReader.java:83)
at com.badlogic.gdx.maps.tiled.TmxMapLoader.load(TmxMapLoader.java:78)
at com.badlogic.gdx.maps.tiled.TmxMapLoader.load(TmxMapLoader.java:65)
at com.mygdx.eclipseiso.screens.Play.show(Play.java:20)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.mygdx.eclipseiso.eclipseiso.create(eclipseiso.java:12)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:120)

原因:com.badlogic.gdx.utils.GdxRuntimeException:找不到文件:E:\Documenti\eclipseiso\desktop\map.tmx(内部) 在 com.badlogic.gdx.files.FileHandle.read(FileHandle.java:136) 在 com.badlogic.gdx.files.FileHandle.reader(FileHandle.java:163) 在 com.badlogic.gdx.utils.XmlReader.parse(XmlReader.java:81) ... 还有 7 个

代码如下:

map = new TmxMapLoader().load("maps/map.tmx");
renderer = new IsometricTiledMapRenderer(map);

并且名为 "map.tmx" 的文件位于 assets/maps.

因此实际路径是:

assets/maps/map.tmx

地图压缩为xml,它被压缩为gzip。

这是map.tmx的内容:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="isometric" renderorder="right-down" width="5" height="5" tilewidth="100" tileheight="50" nextobjectid="1">
 <tileset firstgid="1" name="joj" tilewidth="100" tileheight="350">
  <tile id="0">
   <image width="100" height="350" source="one.png"/>
  </tile>
  <tile id="1">
   <image width="100" height="350" source="two.png"/>
  </tile>
  <tile id="2">
   <image width="100" height="350" source="three.png"/>
  </tile>
 </tileset>
 <layer name="Livello tile 1" width="5" height="5">
  <data encoding="base64" compression="zlib">
   eJxjZmBgYAZiRiTMjCTGBMXMaBibGC4MAAxQAEE=
  </data>
 </layer>
</map>

此外,我通过右键单击资产文件夹并添加一个名为 maps 的新包,通过 Eclipse 创建了 maps 文件夹,然后我始终通过 Eclipse 将所需的文件移动到 maps 文件夹中。

maps 文件夹不是在 assets 中生成的(至少在图形上是这样),所以我将它移到了 assets 文件夹中,但无论如何程序都不会 运行。

原因很明显"File not found"。 它在 ...\desktop\map.tmx 中寻找它,但你说它位于 assets/maps/map.tmx 我认为你应该像这样访问它: map = new TmxMapLoader().load(Gdx.files.internal("maps/map.tmx")); 应该这样做。让我知道它是否有效

我已经解决了:

第一期 - 未找到地图

修复:将文件放在项目的桌面文件夹中,而不是资产中。

使用Gdx.files.internal("map.tmx").file().getAbsolutePath();你可以打印你需要使用的位置。

第二期 - GL30 错误

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: Error compiling shader: Vertex shader failed to compile with the following errors: ERROR: error(#272) Implicit version number 110 not supported by GL3 forward compatible context ERROR: error(#273) 1 compilation errors. No code generated

修复:复制默认着色器并添加 #version 330 作为要写入的第一个字符串。默认着色器可以通过控制台打印的错误找到,你会发现 GDX 默认使用一个非常旧的版本。

这是我的默认着色器的样子:

static public ShaderProgram createDefaultShader () { String vertexShader = "#version 330 core\n" + "in vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "in vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + "in vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + "uniform mat4 u_projTrans;\n" // + "out vec4 v_color;\n" // + "out vec2 v_texCoords;\n" // + "\n" // + "void main()\n" // + "{\n" // + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + " v_color.a = v_color.a * (255.0/254.0);\n" // + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "}\n"; String fragmentShader = "#version 330 core\n" + "#ifdef GL_ES\n" // + "#define LOWP lowp\n" // + "precision mediump float;\n" // + "#else\n" // + "#define LOWP \n" // + "#endif\n" // + "in LOWP vec4 v_color;\n" // + "in vec2 v_texCoords;\n" // + "out vec4 fragColor;\n" // + "uniform sampler2D u_texture;\n" // + "void main()\n"// + "{\n" // + " fragColor = v_color * texture(u_texture, v_texCoords);\n" // + "}"; ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader); if (shader.isCompiled() == false) throw new IllegalArgumentException("Error compiling shader: " + shader.getLog()); return shader; }

然后您需要将其提供给 Batch 对象,然后您将使用该对象渲染地图:

Batch = new SpriteBatch(1000, createDefaultShader()); // not required to be a spriteBatch IsometricTiledMapRenderer renderer= new IsometricTiledMapRenderer(map,spriteBatch);

第三期-black/blinking画面

修复:确保将 super.render(); 放入方法 public void render ()

否则屏幕将是黑色的,如果您在 show() 方法内渲染,您将获得一个闪烁的屏幕。

希望对大家有所帮助!