Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
(1 edit)

Main Menu Screen

The Asset Manager has been set up, and some fonts and sprites sheets were loaded during the loading screen. Now I can create a MainMenuScreen.

The MainMenuScreen code is very simple. Basically, the screen is the same as the LoadingScreen, but it will also display a "Play" button :


Here is the code of the MainMenuScreen.java :

public class MainMenuScreen implements Screen{

    final MyGdxGame game;
    private OrthographicCamera camera;
    private Stage stage;
    private Skin skin;
    private Texture textureLogo;
    private Image imageLogo;
    private TextureAtlas textureAtlas;
    private TextButton playButton, optionButton;
    private TextButtonStyle textButtonStyle;
    
    public MainMenuScreen(final MyGdxGame game){
        this.game = game;

        camera = new OrthographicCamera();
        camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        
        textureLogo = new Texture(Gdx.files.internal("Images/Logo.jpg"), true);
        textureLogo.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.MipMapLinearNearest);
        imageLogo = new Image(textureLogo);
        imageLogo.setWidth(Gdx.graphics.getWidth());
        imageLogo.setHeight(textureLogo.getHeight() * imageLogo.getWidth()/textureLogo.getWidth());
        imageLogo.setX(Gdx.graphics.getWidth()/2 - imageLogo.getWidth()/2);
        imageLogo.setY(Gdx.graphics.getHeight()/2 - imageLogo.getHeight()/2);
        
        stage = new Stage();
        skin = new Skin();
        
        textureAtlas = game.assets.get("Images/Images.pack", TextureAtlas.class);
        skin.addRegions(textureAtlas);
        
        textButtonStyle = new TextButtonStyle();
        textButtonStyle.up = skin.getDrawable("Button");
        textButtonStyle.down = skin.getDrawable("ButtonChecked");
        textButtonStyle.font = game.assets.get("fontMenu.ttf", BitmapFont.class);
        textButtonStyle.fontColor = Color.WHITE;
        textButtonStyle.downFontColor = new Color(0, 0, 0, 1);
        
        playButton = new TextButton("PLAY", textButtonStyle);
        playButton.setHeight(Gdx.graphics.getHeight()/7);
        playButton.setX(Gdx.graphics.getWidth()/2 - playButton.getWidth()/2);
        playButton.setY(29 * Gdx.graphics.getHeight()/100 - playButton.getHeight()/2);
                          
        stage.addActor(imageLogo);
        stage.addActor(playButton);
        
        playButton.addAction(Actions.sequence(Actions.alpha(0)
                ,Actions.fadeIn(0.25f)));
    }
    
    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        
        game.batch.setProjectionMatrix(camera.combined);
        
        stage.act();
        stage.draw();       
    }

    @Override
    public void show() {
        Gdx.input.setInputProcessor(stage);
        
        playButton.addListener(new ClickListener(){
             @Override
                public void clicked(InputEvent event, float x, float y) {
                 game.setScreen(new GameScreen(game));
             }
        });     
    }

    @Override
    public void dispose() {
        this.dispose();
        stage.dispose();
    }
}

In the creator :

  • I create the background image, with exactly the same code I used to display the logo image during the LoadingScreen.
  • 3 new entities are created : a Stage, a TextButton and a Skin.
    • The Stage is an input processor. We can put all our actors (like Buttons) in the Stage, and the Stage will receive input events.
    • The TextButton is an actor. It will trigger a determined event when clicked.
    • The Skin stores resources to create our UI. In my case, I only store the TextureAtlas I loaded in the Asset Manager in the Skin.
  • To create a TextButton, we need to first define a TextButtonStyle. The TextButtonStyle allows us to determine every parameter of the TextButton like its font, color, appearance when it is up, down, or checked... Once the TextButtonStyle created, creating a TextButton requires only one line : playButton = new TextButton("PLAY", textButtonStyle);
  • After creating all this, we only need to add the actors, it is to say, the image and the button to the Stage.
  • To make the MainMenuScreen fancier I make the "Play" button appears with a fade-in effect, with this line : playButton.addAction(Actions.sequence(Actions.alpha(0) ,Actions.fadeIn(0.25f)));

In the render() :

  • We need to animate the Stage, only to have the fade-in effect : stage.act();
  • And we draw the Stage : stage.draw();

In the show():

  • To allow the Stage to receive input, we need this line of code : Gdx.input.setInputProcessor(stage);
  • The we define the action triggered by the "Play" button. For that we set up a ClickListener.

In the dispose(): Like on EVERY screens, we need to dipose everything that can be diposed, to avoid memory leak.

And that's it for the main menu screen !