[英]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$1.run(LwjglApplication.java:120)
引起原因:com.badlogic.gdx.utils.GdxRuntimeException:找不到文件:com.badlogic.gdx.files.FileHandle.read(FileHandle.java:136中的E:\\ Documenti \\ eclipseiso \\ desktop \\ map.tmx(内部) )com.badlogic.gdx.utils.XmlReader.parse(XmlReader.java:81)处的com.badlogic.gdx.files.FileHandle.reader(FileHandle.java:163)...另外7个
代码如下:
map = new TmxMapLoader().load("maps/map.tmx");
renderer = new IsometricTiledMapRenderer(map);
并且名为“ map.tmx”的文件位于资产/地图内部。
因此,实际路径为:
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>
另外,我已经通过Eclipse创建了maps文件夹,方法是右键单击assets文件夹并添加一个名为maps的新程序包,然后我总是通过Eclipse将所需的文件移到maps文件夹中。
maps文件夹不是在资产内部生成的(至少是通过图形方式生成的),因此我将其移动到了Assets文件夹内部,但是无论该程序无法运行。
原因很明显是“找不到文件”。 它在...\\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);
第三期-黑/闪烁的屏幕
修复:确保已放入super.render();
在方法内部public void render ()
否则,屏幕将为黑色,并且如果在show()
方法中进行渲染,则将获得一个闪烁的屏幕。
希望这对某人有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.