UniSimGame.java

package io.github.unisim;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Cursor;
import com.badlogic.gdx.graphics.Pixmap;
import io.github.unisim.screen.*;

import java.util.HashMap;
import java.util.Map;

/**
 * A class implementing the main game loop by extending from {@link Game}.
 */
public class UniSimGame extends Game {
    private Map<GameCursor, Cursor> cursorMap;
    private Leaderboard leaderboard;
    private MusicManager musicManager;
    private Screen startMenuScreen;
    private Screen leaderboardScreen;
    private Screen helpScreen;
    private Screen settingsScreen;
    private Screen gameScreen;

    @Override
    public void create() {
        // Create a map from our cursors to GDX cursors.
        cursorMap = new HashMap<>();
        leaderboard = new Leaderboard();
        musicManager = new MusicManager();

        // Load all the cursors.
        for (var cursor : GameCursor.values()) {
            var pixmap = new Pixmap(Gdx.files.internal(cursor.getPath()));
            cursorMap.put(cursor, Gdx.graphics.newCursor(pixmap, 0, 0));
        }

        // Create all of our stateless screens.
        startMenuScreen = new StartMenuScreen(this);
        leaderboardScreen = new LeaderboardScreen(this);
        helpScreen = new HelpScreen(this);
        settingsScreen = new SettingsScreen(this);

        // Start in the start menu screen.
        setScreen(startMenuScreen);
    }

    @Override
    public void render() {
        // Delegate to the active screen.
        super.render();
        musicManager.update();
    }

    @Override
    public void dispose() {
        super.dispose();

        // Call dispose manually for our screens, Game::dispose() only calls Screen::hide() for the active screen.
        if (gameScreen != null) {
            gameScreen.dispose();
        }
        settingsScreen.dispose();
        helpScreen.dispose();
        leaderboardScreen.dispose();
        startMenuScreen.dispose();
    }

    @Override
    public void resize(int width, int height) {
        if (width + height == 0) {
            return;
        }
        ((FullscreenInputProcessor) GlobalState.fullscreenInputProcessor).resize(width, height);
        startMenuScreen.resize(width, height);
        leaderboardScreen.resize(width, height);
        helpScreen.resize(width, height);
        settingsScreen.resize(width, height);
        if (gameScreen != null) {
            gameScreen.resize(width, height);
        }
    }

    public Screen createGameScreen() {
        if (gameScreen != null) {
            gameScreen.dispose();
        }
        gameScreen = new GameScreen(this);
        return gameScreen;
    }

    public void setCursor(GameCursor cursor) {
        var gdxCursor = cursorMap.get(cursor);
        Gdx.graphics.setCursor(gdxCursor);
    }

    public Leaderboard getLeaderboard() {
        return leaderboard;
    }

    public Screen getStartMenuScreen() {
        return startMenuScreen;
    }

    public Screen getLeaderboardScreen() {
        return leaderboardScreen;
    }

    public Screen getHelpScreen() {
        return helpScreen;
    }

    public Screen getSettingsScreen() {
        return settingsScreen;
    }
}