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

Posted

技术标签:

【中文标题】LibGDX - 调用 TiledMapRenderer.render() 时应用程序崩溃【英文标题】:LibGDX - Application crashes when call TiledMapRenderer.render() 【发布时间】:2012-07-29 01:28:00 【问题描述】:
@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 tuto 和 this 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();

仍然崩溃iiiiiiiiiiiiiiingg..... 如果有人可以请提供一些帮助,将不胜感激,因为 atm 我真的要疯了!

【问题讨论】:

当我弄乱了我的网格定义(忘记加载顶点或将长度设置为零)时,我看到了类似的异常。因此,您的平铺地图定义很可能有问题。检查是否有您不满足的尺寸/比例要求(例如 2 的幂或 X 的最小值,或类似的东西)。 感谢您的回答。我刚刚检查了所有是否为 2 的幂:相机的视口、每个图块的大小以及我的 level.png 的大小,其中包含打包在一个图像中的所有图块。只有地图大小不合适,但改变它并没有解决我的问题,反正教程使用的是 60*15 的地图,所以显示的地图也不适合。 【参考方案1】:

我找到了导致错误的原因: 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

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

快乐的映射:)!

【讨论】:

我也使用了“TexturePacker GUI”,遇到了同样的问题。感谢您提供替代方案! @tsukimi 我通过发布我的 zip 上传了链接。我不确定这是否是好的,因为我有几个打包机,所以请告诉我这是否像我的帖子中所说的那样工作。 @miNde 感谢上传。这与我现在使用的程序相同。问题在于它的打包方式,它从左下角开始打包并向上打包,因为平铺编辑器需要从左到右从左上角打包的图像,您是否在打包文件上使用了平铺?现在平铺包文件中的索引不匹配 我只做了很差的测试,是的,它奏效了。但问题是,自从我写这篇文章以来,我一直很忙于其他事情,所以我没有机会经常使用它。无论如何,我在我的 HD 中找到了另一个瓦片打包器,所以如果你愿意,我可以上传它。 @tsukimi 我在答案中添加了链接。

以上是关于LibGDX - 调用 TiledMapRenderer.render() 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上使用来自 libGDX 的 SQLite

集成Admob后,我的Libgdx游戏速度变慢

Libgdx之监听用户输入

libGDX奇怪的渲染错误

Libgdx 之Actions 动作类

LibGDX - 绘制到 FrameBuffer 不起作用