我在处理屏幕时遇到问题。当我尝试处置 OrthogonalTiledMapRenderer 时,收到此错误消息。我在网上查了一下,没有发现任何其他这样的例子或发生这种情况的情况。
Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: buffer not allocated with newUnsafeByteBuffer or already disposed
at com.badlogic.gdx.utils.BufferUtils.disposeUnsafeByteBuffer(BufferUtils.java:507)
at com.badlogic.gdx.graphics.glutils.VertexArray.dispose(VertexArray.java:67)
at com.badlogic.gdx.graphics.Mesh.dispose(Mesh.java:551)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.dispose(SpriteBatch.java:944)
at com.badlogic.gdx.maps.tiled.renderers.BatchTiledMapRenderer.dispose(BatchTiledMapRenderer.java:152)
at org.shawnhenry.rollypauly.screens.GameScreen.dispose(GameScreen.java:264)
at org.shawnhenry.rollypauly.screens.GameScreen.hide(GameScreen.java:238)
at org.shawnhenry.rollypauly.InputHandler.doTap(InputHandler.java:147)
at org.shawnhenry.rollypauly.InputHandler.touchUp(InputHandler.java:117)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:305)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:199)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
我的实现非常简单。
在我的主要方法中,我初始化渲染器:
renderer = new OrthogonalTiledMapRenderer(world.getTiledMap());
渲染方法调用渲染器来绘制对象,例如:
renderer.render(backgroundLayers);
和
renderer.getSpriteBatch().draw(resume, world.getResumeButton().x, world.getResumeButton().y, world.getResumeButton().width, world.getResumeButton().height);
这是错误消息中提到的各种类/函数的跟踪:
来自“输入处理程序”
if(mainMenu.contains(x, y)){//Tapped the mainMenu button.
//Gdx.app.log("InputHandler", "Hit menu button!");
gameScreen.getGame().setScreen(new LevelSelectScreen(gameScreen.getGame()));
gameScreen.hide();
}
来自“游戏屏幕”
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
renderer.dispose();
//world.dispose();
}
您能给我的任何帮助都会很棒。如果我处理我的世界级,而不是渲染器,我不会收到错误。我担心的是,我相信渲染器是一个资源密集型对象,因此在离开屏幕时需要将其丢弃。
我相信解决了我的问题。我认为我调用了两次 dispose,但我查看了整个代码,唯一调用 dispose()
的地方是 hide()
期间的一次,而 hide()
在此期间仅被调用一次:
if(mainMenu.contains(x, y)){//Tapped the mainMenu button.
//Gdx.app.log("InputHandler", "Hit menu button!");
gameScreen.getGame().setScreen(new LevelSelectScreen(gameScreen.getGame()));
gameScreen.hide();
}
我认为我的问题是,当我将新屏幕设置为 LevelSelectScreen()
时,随着 LevelSelectScreen()
获得焦点,hide()
函数会自动调用...dispose()
第一次被调用。然后,当我显式调用它时,它会在下一行再次调用 gameScreen.hide()'
。
我是一名优秀的程序员,十分优秀!