我在处理屏幕时遇到了问题。当我尝试处理我的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)
我的实施非常简单。
在我的main方法中,我初始化渲染器:
renderer = new OrthogonalTiledMapRenderer(world.getTiledMap());
渲染方法称为渲染器,用于绘制如下对象:
renderer.render(backgroundLayers);
和
renderer.getSpriteBatch().draw(resume, world.getResumeButton().x, world.getResumeButton().y, world.getResumeButton().width, world.getResumeButton().height);
以下是错误消息中提到的各种类/函数的跟踪:
FROM“InputHandler”
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();
}
FROM“GameScreen”
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
renderer.dispose();
//world.dispose();
}
你能给我的任何帮助都会很棒。如果我处理我的世界级,而不是渲染器,我不会得到错误。我担心的是我认为渲染器是一个资源很重的物体,因此当离开屏幕时需要将其处理掉。
答案 0 :(得分:1)
我相信解决了我的问题。我想我两次调用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()
时,hide()
功能会自动调用LevelSelectScreen()
获得焦点... dispose()
是第一次被召唤。然后当我明确地称它为gameScreen.hide()'
时,它会在下一行再次调用。