package com.captstudios.games.tafl.core.screen; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.captstudios.games.tafl.core.TaflGame; import com.captstudios.games.tafl.core.consts.Assets; import com.captstudios.games.tafl.core.consts.Constants; import com.captstudios.games.tafl.core.enums.AiType; import com.captstudios.games.tafl.core.utils.DoubleTextureDrawable; import com.roundtriangles.games.zaria.screen.AbstractScreen; public class LevelSelectionScreen extends AbstractScreen<TaflGame> { ImageButton boardSelector; Sprite[] boardValues; ImageButton sideSelector; Sprite[] sideValues; ImageButton difficultySelector; Sprite[] difficultyValues; public LevelSelectionScreen(TaflGame game) { super(game, game.mainMenuScreen, Constants.ScreenConstants.FADE_TIME); } @Override public void initialize() { Sprite background = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_BACKGROUNDS, Assets.Backgrounds.MENU); setBackgroundImage(new Image(background)); Table table = new Table(); table.setFillParent(true); table.defaults().space(game.deviceSettings.menuSpacing); createBoardSelector(table); createSideSelector(table); createDifficultySelector(table); createButtons(); if (Constants.GameConstants.DEBUG) { table.debug(); } stage.addActor(table); } private void createDifficultySelector(Table table) { Sprite labelSprite = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.LEVEL); Image difficultyImageLabel = new Image(new TextureRegionDrawable(new TextureRegion(labelSprite))); float height = game.deviceSettings.menuLabelHeight; float width = height * (difficultyImageLabel.getWidth() / difficultyImageLabel.getHeight()); table.add(difficultyImageLabel).spaceBottom(game.deviceSettings.menuSpacing).size(width, height).expandX().right(); difficultyValues = new Sprite[] { game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.BEGINNER), game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.INTERMEDIATE), game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.ADVANCED) }; Sprite up = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.PLAY_AS_BLANK); Sprite down = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.PLAY_AS_PRESSED); final AiType initialType = game.preferenceService.getAiType(); Sprite selectorTest = difficultyValues[initialType.ordinal()]; difficultySelector = new ImageButton( new DoubleTextureDrawable(new TextureRegion(up), new TextureRegion(selectorTest)), new DoubleTextureDrawable(new TextureRegion(down), new TextureRegion(selectorTest))); height = game.deviceSettings.menuSelectorHeight; width = height * (up.getWidth() / up.getHeight()); table.add(difficultySelector).size(width, height).expandX().left(); table.row(); } private void createBoardSelector(Table table) { Sprite labelSprite = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.SIZE); Image imageLabel = new Image(new TextureRegionDrawable(new TextureRegion(labelSprite))); float height = game.deviceSettings.menuLabelHeight; float width = height * (imageLabel.getWidth() / imageLabel.getHeight()); table.add(imageLabel).spaceBottom(game.deviceSettings.menuSpacing).size(width, height).expandX().right(); boardValues = new Sprite[] { game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.SIZE_11), game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.SIZE_9), }; Sprite up = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.SIZE_BLANK); Sprite down = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.SIZE_PRESSED); Sprite selectorText = boardValues[game.preferenceService.getLevelIndex()]; boardSelector = new ImageButton( new DoubleTextureDrawable(new TextureRegion(up), new TextureRegion(selectorText)), new DoubleTextureDrawable(new TextureRegion(down), new TextureRegion(selectorText))); height = game.deviceSettings.menuSelectorHeight; width = height * (up.getWidth() / up.getHeight()); table.add(boardSelector).size(width, height).expandX().left(); table.row(); } private void createSideSelector(Table table) { Sprite labelSprite = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.PLAY_AS); Image imageLabel = new Image(new TextureRegionDrawable(new TextureRegion(labelSprite))); float height = game.deviceSettings.menuLabelHeight * 1.5f; float width = height * (imageLabel.getWidth() / imageLabel.getHeight()); table.add(imageLabel).spaceBottom(game.deviceSettings.menuSpacing).size(width, height).expandX().right(); sideValues = new Sprite[] { game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.PLAY_WHITE), game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.TextGraphics.PLAY_BLACK), }; Sprite up = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.PLAY_AS_BLANK); Sprite down = game.graphicsService.getSprite( Assets.GraphicFiles.ATLAS_PIECES, Assets.ButtonGraphics.PLAY_AS_PRESSED); final int index = game.preferenceService.getComputerStarts() ? Constants.BoardConstants.WHITE_TEAM : Constants.BoardConstants.BLACK_TEAM; Sprite selectorText = sideValues[index]; sideSelector = new ImageButton( new DoubleTextureDrawable(new TextureRegion(up), new TextureRegion(selectorText)), new DoubleTextureDrawable(new TextureRegion(down), new TextureRegion(selectorText))); height = game.deviceSettings.menuSelectorHeight; width = height * (up.getWidth() / up.getHeight()); table.add(sideSelector).size(width, height).expandX().left(); table.row(); } private void createButtons() { Table buttonTable = new Table(); buttonTable.right().bottom().setFillParent(true); buttonTable.defaults().pad(game.deviceSettings.menuSpacing).size(game.deviceSettings.menuButtonHeight); Sprite icon = game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.Icons.BACK); Button button = game.createSwitchScreenButton(icon, this, game.mainMenuScreen); buttonTable.add(button).expandX().left(); icon = game.graphicsService.getSprite(Assets.GraphicFiles.ATLAS_PIECES, Assets.Icons.PLAY); button = new ImageButton(new TextureRegionDrawable(new TextureRegion(icon))); button.addListener(new ChangeListener() { @Override public void changed (ChangeEvent event, Actor actor) { game.soundService.playSound(Assets.Sounds.CLICK_SOUND); game.gamePlayScreen.createNewMatch(); if (game.preferenceService.getShowHelpOnStart()) { game.instructionScreen.parentScreen = game.gamePlayScreen; switchScreen(game.instructionScreen); } else { switchScreen(game.gamePlayScreen); } } }); buttonTable.add(button); if (Constants.GameConstants.DEBUG) { buttonTable.debug(); } stage.addActor(buttonTable); } @Override public void show() { super.show(); updateBoardSelector(); updateSideSelector(); updateDifficultySelector(); } private void updateSideSelector() { final int index = game.preferenceService.getComputerStarts() ? Constants.BoardConstants.WHITE_TEAM : Constants.BoardConstants.BLACK_TEAM; ((DoubleTextureDrawable)sideSelector.getStyle().imageDown).setInnerRegion(sideValues[index]); ((DoubleTextureDrawable)sideSelector.getStyle().imageUp).setInnerRegion(sideValues[index]); sideSelector.addListener(new ChangeListener() { int selected = index; @Override public void changed(ChangeEvent event, Actor actor) { selected = (selected + 1) % 2; ((DoubleTextureDrawable)sideSelector.getStyle().imageDown).setInnerRegion(sideValues[selected]); ((DoubleTextureDrawable)sideSelector.getStyle().imageUp).setInnerRegion(sideValues[selected]); game.preferenceService.setComputerStarts(selected == Constants.BoardConstants.WHITE_TEAM); game.preferenceService.setLevelIndex(selected); game.soundService.playSound(Assets.Sounds.CLICK_SOUND); } }); } private void updateBoardSelector() { ((DoubleTextureDrawable)boardSelector.getStyle().imageDown).setInnerRegion( boardValues[game.preferenceService.getLevelIndex()]); ((DoubleTextureDrawable)boardSelector.getStyle().imageUp).setInnerRegion( boardValues[game.preferenceService.getLevelIndex()]); boardSelector.addListener(new ChangeListener() { int selected = game.preferenceService.getLevelIndex(); @Override public void changed(ChangeEvent event, Actor actor) { selected = (selected + 1) % boardValues.length; ((DoubleTextureDrawable)boardSelector.getStyle().imageDown).setInnerRegion(boardValues[selected]); ((DoubleTextureDrawable)boardSelector.getStyle().imageUp).setInnerRegion(boardValues[selected]); game.preferenceService.setLevelIndex(selected); game.soundService.playSound(Assets.Sounds.CLICK_SOUND); } }); } private void updateDifficultySelector() { final AiType initialType = game.preferenceService.getAiType(); ((DoubleTextureDrawable)difficultySelector.getStyle().imageDown).setInnerRegion(difficultyValues[initialType.ordinal()]); ((DoubleTextureDrawable)difficultySelector.getStyle().imageUp).setInnerRegion(difficultyValues[initialType.ordinal()]); difficultySelector.addListener(new ChangeListener() { int selected = initialType.ordinal(); @Override public void changed(ChangeEvent event, Actor actor) { selected = (selected + 1) % difficultyValues.length; ((DoubleTextureDrawable)difficultySelector.getStyle().imageDown).setInnerRegion(difficultyValues[selected]); ((DoubleTextureDrawable)difficultySelector.getStyle().imageUp).setInnerRegion(difficultyValues[selected]); game.preferenceService.setAiType(AiType.values()[selected]); game.soundService.playSound(Assets.Sounds.CLICK_SOUND); } }); } }