Java Libgdx-使用.isPressed()时堆栈溢出

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

我正在使用最新版本的Libgdx编写菜单。每个屏幕主菜单屏幕、选项菜单屏幕、信用菜单屏幕都包含一些按钮。每个按钮都应该改变屏幕。 如果我在MainMenuScreen上并按credits,我将获得CreeditsNuscreen。但当我使用“后退”按钮返回主菜单时,会出现stackOverflow错误

以下是代码的一些部分:

//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();
    }


}