2017-02-01 11 views
-1

私はLibgdxの最新バージョンを使用してメニューをコーディングしています。各画面(MainMenuScreen、OptionsMenuScreen、CreditsMenuScreen)にはいくつかのボタンがあります。各ボタンは画面を変更する必要があります。 MainMenuScreenを開いて「クレジット」を押すと、私はCreeditsMenuScreenを取得します。しかし、メインメニューに戻るために「戻るボタン」を使用すると、stackOverflowエラーが発生します。ここで.isPressed()を使用したときのLibgdx - stackOverFlow

は、コードの一部である:ここで

//In the MainMenuScreen.java: 
    if(creditsButton.isPressed()) { 
     menuManager.setScreen("credits"); 
    } 

//In the CreditsMenuScreen.java I have 
    if(backButton.isPressed()) { 
       menuManager.setScreen("main"); 
      } 

はエラーです。あなたが戻って、他の1つの画面から切り替えると、もう一つは、それ以来、それに呼ばれるupdate()を持っていない

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) 
+0

からバックボタンと同じ位置にある別のボタンがあります:

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

そしてここでは、メインクラスです。ここ

はMenuManagerクラスですクレジットページ? – munyul

+0

あなたの問題は実際に '.isPressed()'とは思えません。スタックトレースを見ると、コード内の3つの場所(CreditsMenuScreen、MenuManager、MainMenuScreen)を詳しく見てみることをお勧めします。 – munyul

+0

いいえ、それらは同じ場所にありません。 –

答えて

3

..私はそれがタッチイベントに接続されていると思うが、私はそれを修正する方法がわかりません最後にsetScreen()と呼ばれ、そのボタンはまだ押されています。したがって、両方のボタンが押された状態にあり、決して解放する機会を得ることができないので、画面は前後に切り替えられます。

isPressed()を使用する代わりに、各ボタンにChangeListenerを追加し、リスナーでpublic void changed (ChangeEvent event, Actor actor)をオーバーライドし、そこで画面を変更します。このように:私は問題を解決し

/// in screen constructor 
creditsButton.addListener(new ChangeListener(){ 
    public void changed (ChangeEvent event, Actor actor){ 
     menuManager.setScreen("credits"); 
    } 
}); 
+0

私は試みましたが、menuManager.setScreen( "credit");動作しません。 –

+0

代わりに、System.out.println( "test")だけを使用すると、それは.. –

+0

"働かない"という意味ですか?私はあなたのメニューマネージャクラスが内部的にどのように動作するのか分かりません。 – Tenfour04

0

(私はrenderメソッドでsuper.renderを()を添加)が、今、すべての画面は、マウスがウィンドウに移動しているときにフリックなっています。 、メイン画面で

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


} 
+0

新しい問題が発生した場合は、別の質問として投稿する必要があります。このサイトの回答では、質問に適切に回答する手段はありません。 – Tenfour04

関連する問題