我正在尝试使用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:找不到文件:E:\ Documenti \ eclipseiso \ desktop \ map.tmx(Internal) 在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>
此外,我通过右键单击assets文件夹并添加一个名为maps的新包,通过Eclipse创建了maps文件夹,然后我将所需的文件移动到maps文件夹中,始终通过Eclipse。
在资产中没有生成地图文件夹(至少是图形化的),所以我将它移到了资产文件夹中,但无论如何程序都不会运行。
答案 0 :(得分:0)
原因显然是“未找到档案”。
它在...\desktop\map.tmx
中查找,但您说它位于assets/maps/map.tmx
我认为您应该像以下一样访问它:
map = new TmxMapLoader().load(Gdx.files.internal("maps/map.tmx"));
应该这样做。让我知道它是否有效
答案 1 :(得分:0)
我已经解决了这个问题:
第一期 - 未找到地图
修复:将文件放在项目的桌面文件夹中,而不是放在资产内。
使用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 = new SpriteBatch(1000, createDefaultShader()); // not required to be a spriteBatch
IsometricTiledMapRenderer renderer= new IsometricTiledMapRenderer(map,spriteBatch);
第三个问题 - 黑屏/闪烁屏幕
修复:确保您已将super.render();
放入方法public void render ()
否则屏幕将为黑色,如果您在show()
方法内渲染,则会获得闪烁的屏幕。
希望这有助于某人!