how to properly implement a Dialog box using libgdx

后端 未结 1 992
醉话见心
醉话见心 2020-12-20 22:54

I\'m struggling with implementing a dialog box in my program. The main program does not use stage. However when the users lives are at 0 I would like to popup a dialog that

相关标签:
1条回答
  • 2020-12-20 23:10

    The Dialog class is a little unintuitive without taking a closer look.

    That's why I provide a small working example:

    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.scenes.scene2d.Stage;
    import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
    import com.badlogic.gdx.scenes.scene2d.ui.Skin;
    import com.badlogic.gdx.utils.Timer;
    import com.badlogic.gdx.utils.Timer.Task;
    
    public class TestGame extends ApplicationAdapter
    {
        Dialog  endDialog;
    
        Skin    skin;
        Stage   stage;
    
        @Override
        public void create()
        {
            skin = new Skin(Gdx.files.internal("uiskin.json"));
    
            stage = new Stage();
    
            Gdx.input.setInputProcessor(stage);
    
            endDialog = new Dialog("End Game", skin)
            {
                protected void result(Object object)
                {
                    System.out.println("Option: " + object);
                    Timer.schedule(new Task()
                    {
    
                        @Override
                        public void run()
                        {
                            endDialog.show(stage);
                        }
                    }, 1);
                };
            };
    
            endDialog.button("Option 1", 1L);
            endDialog.button("Option 2", 2L);
    
            Timer.schedule(new Task()
            {
    
                @Override
                public void run()
                {
                    endDialog.show(stage);
                }
            }, 1);
    
        }
    
        @Override
        public void render()
        {
            Gdx.gl.glClearColor(1, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            stage.act();
            stage.draw();
    
        }
    
        @Override
        public void dispose()
        {
            stage.dispose();
        }
    }
    

    Each time you click on an Dialog option (option 1 or option 2) the result object is printed on the system.out (here 1L or 2L, can be any object) and the dialog is displayed again in 1 second.

    The uiskin is taken from the libgdx tests.

    To adapt it more to your needs you can change the result method to:

    protected void result(Object object)
    {
        if (object.equals(1L))
        {
            gameScreen.setIntLives(3);
            gameScreen.setIntScore(0);
            System.out.println("Button Pressed");
        } else {
            // Goto main menut
        }
    };
    

    And add the buttons like this:

    endDialog.button("Retry", 1L);
    endDialog.button("Main Menu", 2L);
    

    Note that the Dialog class is only instantiated once. (so my comment was not correct)


    Just to give you an idea on what you can do with it:

    Since any object can be used you could use reflection:

    try
    {
        endDialog.button("doX",
                ClassReflection.getDeclaredMethod(this.getClass(), "doX"));
        endDialog.button("doY",
                ClassReflection.getDeclaredMethod(this.getClass(), "doY"));
    } catch (ReflectionException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    And the result method would look like:

    protected void result(Object object)
    {
        try
        {
            ((Method) object).invoke(TestGame.this);
        } catch (ReflectionException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    };
    

    Now you just need to implement these methods:

    public void doX()
    {
        System.out.println("doX");
    }
    
    public void doY()
    {
        System.out.println("doY");
    }
    

    Just to give you a few ideas.

    0 讨论(0)
提交回复
热议问题