Java Libgdx-使用.isPressed()时堆栈溢出
我正在使用最新版本的Libgdx编写菜单。每个屏幕主菜单屏幕、选项菜单屏幕、信用菜单屏幕都包含一些按钮。每个按钮都应该改变屏幕。 如果我在MainMenuScreen上并按credits,我将获得CreeditsNuscreen。但当我使用“后退”按钮返回主菜单时,会出现stackOverflow错误 以下是代码的一些部分:Java Libgdx-使用.isPressed()时堆栈溢出,java,android,libgdx,touch-event,Java,Android,Libgdx,Touch Event,我正在使用最新版本的Libgdx编写菜单。每个屏幕主菜单屏幕、选项菜单屏幕、信用菜单屏幕都包含一些按钮。每个按钮都应该改变屏幕。 如果我在MainMenuScreen上并按credits,我将获得CreeditsNuscreen。但当我使用“后退”按钮返回主菜单时,会出现stackOverflow错误 以下是代码的一些部分: //In the MainMenuScreen.java: if( creditsButton.isPressed() ) { menuManage
//In the MainMenuScreen.java:
if( creditsButton.isPressed() ) {
menuManager.setScreen("credits");
}
//In the CreditsMenuScreen.java I have
if( backButton.isPressed() ) {
menuManager.setScreen("main");
}
这里是错误。我认为它与touchevent有关,但我不知道如何修复它
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.StackOverflowError
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:133)
Caused by: java.lang.StackOverflowError
at org.lwjgl.BufferChecks.checkDirect(BufferChecks.java:138)
at org.lwjgl.opengl.GL20.glVertexAttribPointer(GL20.java:856)
at com.badlogic.gdx.backends.lwjgl.LwjglGL20.glVertexAttribPointer(LwjglGL20.java:829)
at com.badlogic.gdx.graphics.glutils.ShaderProgram.setVertexAttribute(ShaderProgram.java:657)
at com.badlogic.gdx.graphics.glutils.VertexArray.bind(VertexArray.java:115)
at com.badlogic.gdx.graphics.Mesh.bind(Mesh.java:380)
at com.badlogic.gdx.graphics.Mesh.bind(Mesh.java:371)
at com.badlogic.gdx.graphics.Mesh.render(Mesh.java:479)
at com.badlogic.gdx.graphics.Mesh.render(Mesh.java:449)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.flush(SpriteBatch.java:975)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.setTransformMatrix(SpriteBatch.java:1037)
at com.badlogic.gdx.scenes.scene2d.Group.resetTransform(Group.java:210)
at com.badlogic.gdx.scenes.scene2d.Group.draw(Group.java:58)
at com.badlogic.gdx.scenes.scene2d.Stage.draw(Stage.java:128)
at com.rander.GameMenu.MainMenuScreen.show(MainMenuScreen.java:86)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.rander.GameMenu.MenuManager.setScreen(MenuManager.java:44)
at com.rander.GameMenu.CreditsMenuScreen.show(CreditsMenuScreen.java:74)
当您从一个屏幕切换回另一个屏幕时,另一个屏幕自上次为响应按钮按下而调用setScreen以来,未调用更新,因此其按钮仍被按下。因此,屏幕将不断来回切换,因为两个按钮都处于按下状态,永远没有机会释放 不要使用iPressed,而是在每个按钮上添加一个ChangeListener,并在listener中覆盖public void changed ChangeEvent事件、Actor并在那里更改屏幕。像这样:
/// in screen constructor
creditsButton.addListener(new ChangeListener(){
public void changed (ChangeEvent event, Actor actor){
menuManager.setScreen("credits");
}
});
我解决了这个问题,在render方法中添加了super.render,但是现在,当鼠标在窗口中移动时,每个屏幕都在闪烁 以下是MenuManager类:
public class MenuManager {
private static MenuManager uniqueInstance;
HashMap<String, Screen> menuMap;
Game game;
private MenuManager(Game game) {
this.game = game;
menuMap = new HashMap<String, Screen>();
}
public static MenuManager getInstance(Game game) {
if(uniqueInstance == null) {
uniqueInstance = new MenuManager(game);
}
return uniqueInstance;
}
public void addMenuItem(String type, Screen screen) {
menuMap.put(type, screen);
}
public void removeMenuItem(String type) {
Screen remove = menuMap.remove(type);
}
public Screen getScreen(String type) {
return menuMap.get(type);
}
public void setScreen(String type) {
game.setScreen(getScreen(type));
}
}
在主屏幕上,是否有另一个按钮位于与credits页面上的back按钮相同的位置?我不认为您的问题实际上与。我认为,查看stacktrace,我建议您仔细查看代码credits功能屏幕中的3个位置,菜单管理器和MainMenuScreen。否,它们不在同一个位置。我尝试了,但是menuManager.setScreencredits;不工作,不工作意味着什么?我不知道菜单管理器类的内部行为。如果你有新问题,你应该将其作为单独的问题发布。在这个网站上,没有办法在回答中充分地回答一个问题。
public class TestGame extends Game {
MenuManager menuManager;
Screen mainMenuScreen;
Screen creditsMenuScreen;
Screen optionsMenuScreen;
@Override
public void create() {
Gdx.graphics.setContinuousRendering(false);
menuManager = MenuManager.getInstance(this);
mainMenuScreen = new MainMenuScreen(menuManager);
creditsMenuScreen = new CreditsMenuScreen(menuManager);
optionsMenuScreen = new OptionsMenuScreen(menuManager);
menuManager.addMenuItem("main", mainMenuScreen);
menuManager.addMenuItem("credits", creditsMenuScreen);
menuManager.addMenuItem("options", optionsMenuScreen);
//Gdx.gl.glClearColor(0, 0, 0, 0);
//Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
setScreen(menuManager.getScreen("main"));
}
@Override
public void resize(int width, int height) {
super.resize(width, height);
}
@Override
public void render () {
super.render(); //important!
}
@Override
public void pause() {
//super.pause();
}
@Override
public void resume() {
//super.resume();
}
@Override
public void dispose () {
super.dispose();
}
}