I created an abstract screen class that contains all the common objects for the screen, and each of my screens extends this abstract class. And it looks like this:
public abstract class AbstractScreen implements Screen { protected final Game game; protected InputMultiplexer multiInputProcessor; protected ScreenInputHandler screenInputHandler; protected Stage uiStage; protected Skin uiSkin; public AbstractScreen(Game game) { this.game = game; this.uiStage = new Stage(); this.uiSkin = new Skin(); this.screenInputHandler = new ScreenInputHandler(game); this.multiInputProcessor = new InputMultiplexer(); multiInputProcessor.addProcessor(uiStage); multiInputProcessor.addProcessor(screenInputHandler); Gdx.input.setInputProcessor(multiInputProcessor); } private static NinePatch processNinePatchFile(String fname) { final Texture t = new Texture(Gdx.files.internal(fname)); final int width = t.getWidth() - 2; final int height = t.getHeight() - 2; return new NinePatch(new TextureRegion(t, 1, 1, width, height), 3, 3, 3, 3); } @Override public void render (float delta) { Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); uiStage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f)); uiStage.draw(); Table.drawDebug(uiStage); } @Override public void resize (int width, int height) { } @Override public void show() { } @Override public void hide() { dispose(); } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { uiStage.dispose(); uiSkin.dispose(); } }
When I want to create a new class, I just expand the abstract screen and add what I need. For example, I have a screen with basic credits, I just need to create components, but an abstract screen draws it:
public class CreditsScreen extends AbstractScreen { public CreditsScreen(final Game game) { super(game);
I also have one class that processes input for all screens, a specific task is intended for this, how the back button works around different screens. And this handler class is created in an abstract class.
public class ScreenInputHandler implements InputProcessor { private final Game game; public ScreenInputHandler(Game game) { this.game = game; } @Override public boolean keyDown(int keycode) { if(keycode == Keys.BACK || keycode == Keys.BACKSPACE){ if (game.getScreen() instanceof MainMenuScreen) { Gdx.app.exit(); } if (game.getScreen() instanceof GameScreen) { World.getInstance().togglePause(false); } if (game.getScreen() instanceof CreditsScreen) { game.setScreen(new MainMenuScreen(game)); } } return false; } }
source share