LibGDX - 调用TiledMapRenderer.render()时应用程序崩溃

时间:2012-07-31 09:51:31

标签: java android 2d render libgdx

@Override
public void render(float delta) {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    camera.update();
    sprite.setProjectionMatrix(camera.combined);

    mLevel.getTiledMapRenderer().getProjectionMatrix().set(camera.combined);
    Vector3 tmp = new Vector3();
    tmp.set(0, 0, 0);
    camera.unproject(tmp);
    mLevel.getTiledMapRenderer().render(tmp.x, tmp.y, camera.viewportWidth, camera.viewportHeight);

    sprite.begin();
    ...
    sprite.end();
}

以下是启动桌面版时的内容:

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: Number of remaining buffer elements is 0, must be at least 1. Because at most 1 elements can be returned, a buffer with at least 1 elements is required, regardless of actual returned element count
    at org.lwjgl.BufferChecks.throwBufferSizeException(BufferChecks.java:162)
    at org.lwjgl.BufferChecks.checkBufferSize(BufferChecks.java:189)
    at org.lwjgl.BufferChecks.checkBuffer(BufferChecks.java:230)
    at org.lwjgl.opengl.GL15.glBufferData(GL15.java:141)
    at com.badlogic.gdx.backends.lwjgl.LwjglGL20.glBufferData(LwjglGL20.java:93)
    at com.badlogic.gdx.graphics.glutils.VertexBufferObject.bind(VertexBufferObject.java:208)
    at com.badlogic.gdx.graphics.Mesh.bind(Mesh.java:268)
    at com.badlogic.gdx.graphics.g2d.SpriteCache.begin(SpriteCache.java:868)
    at com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer.render(TileMapRenderer.java:336)
    at com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer.render(TileMapRenderer.java:286)
    at com.crunsh.libgdx.screens.GameScreen.render(GameScreen.java:102)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:202)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:131)

我已经尝试了this tutothis one,我在同一行mLevel.getTiledMapRenderer().render(tmp.x, tmp.y, camera.viewportWidth, camera.viewportHeight);得到了相同的错误。

编辑:我刚注意到我的.tmx文件的数据是由Tiled Map Editor自动编码的,所以我只是将其停用,但仍然会出现同样的错误。
如果我复制/粘贴this project(我的意思是整个项目,不仅仅是render()方法)它可以工作,但当我尝试在我自己的项目中加载我自己的地图时它只会崩溃...

所以在那之后我决定简化我的render()方法,就像我之前提供的链接一样,并使用作者提供的TiledMapHelper class,所以现在有render()方法:

mHelper.getCamera().update();
mHelper.render();

仍然是crashiiiiiiiiiiiiiingg .....
如果有人可以提供一些帮助,我将非常感激,因为我真的很生气!

1 个答案:

答案 0 :(得分:8)

我找到了导致错误的原因:
1)我的“packfile”中的所有图块都有-1作为其索引
2)我的“packfile”中的所有图块都与其原始图块文件名相同,但与包含所有图块的.png文件的名称不同。

目前我的屏幕是黑色的,所以我认为没有绘制瓷砖(可能是因为我给包文件中的瓷砖提供了随机索引 - 已修复,请参见帖子的结尾)但没有抛出任何异常这就是重点。

这些错误是由于我用来打包本应该让我赢得时间的牌的程序。所以我会尝试不同的选择或使用别的东西 如果你想知道程序是“TexturePacker GUI”v3.1.0。

如果您知道我应该/不使用哪些选项以避免错误,请告诉我。

编辑:找到了一个有用的工具,用于打包瓷砖,这里是: http://freigabe.philweb.de/bubblr/texturepacker_edited.jar (链接已经死了;请使用此代码=> http://bit.ly/1a831nv或其他打包工具=> http://bit.ly/1aLgAFt

要使用它打开cmd并转到下载.jar文件的目录,然后:

//You should create, in the same directory of the .jar file, two additionnal folders
//Call the first folder 'input' and put in all your tiles (rename them "level_1.png", "level_..")
//Call the 2nd folder 'output' and leave it empty
//Then just type in the command prompt : java -jar nameOfDownloadedJarFile.jar input output level
//Then rename the "input1.png" into "level.png", and "level.pack" into "level packfile"
//Open "level packfile" with notepad and change "input1.png" into "level.png"
//Then draw your map using "level.png" in TiledMapEditor
//Then just follow dpk' tutorial for rendering the map and it should work

以下是我提到的dpk教程,请点击此处:http://dpk.net/2011/05/01/libgdx-box2d-tiled-maps-full-working-example-part-1/#p4

如果应用程序没有崩溃但是屏幕是黑色的,只需增加相机的视口宽度&高度。

快乐映射:)!