/* * Copyright 2012-2013 Ivan Gadzhega * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package net.ivang.axonix.main.screens; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.esotericsoftware.tablelayout.Cell; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; import net.ivang.axonix.main.AxonixGame; import net.ivang.axonix.main.actors.levels.LevelButton; import net.ivang.axonix.main.events.intents.BackIntent; import net.ivang.axonix.main.events.intents.DefaultIntent; import net.ivang.axonix.main.events.intents.screen.GameScreenIntent; import net.ivang.axonix.main.events.intents.screen.StartScreenIntent; import net.ivang.axonix.main.preferences.PreferencesWrapper; import net.ivang.axonix.main.utils.ScoreUtils; /** * @author Ivan Gadzhega * @since 0.1 */ public class LevelsScreen extends BaseScreen { private final static int LEVELS_TABLE_COLS = 5; private Style style; private Table levelsTable; private int defaultLevelIndex; @Inject private PreferencesWrapper preferences; @Inject private LevelsScreen(final AxonixGame game, InputMultiplexer inputMultiplexer, EventBus eventBus) { super(game, inputMultiplexer, eventBus); levelsTable = new Table(); for (int levelNumber = 1; levelNumber <= game.getLevelsFiles().size(); levelNumber++) { LevelButton button = new LevelButton(levelNumber, style.button, eventBus); levelsTable.add(button); if (levelNumber % LEVELS_TABLE_COLS == 0) { levelsTable.row(); } } ScrollPane scrollPane = new ScrollPane(levelsTable); scrollPane.setFillParent(true); stage.addActor(scrollPane); } @Override public void show() { super.show(); for(Cell cell : levelsTable.getCells()) { updateButtonState((LevelButton) cell.getWidget()); } } //--------------------------------------------------------------------- // Subscribers //--------------------------------------------------------------------- @Subscribe @SuppressWarnings("unused") public void doDefaultAction(DefaultIntent intent) { eventBus.post(new GameScreenIntent(defaultLevelIndex)); } @Subscribe @SuppressWarnings("unused") public void doBacktAction(BackIntent intent) { eventBus.post(new StartScreenIntent()); } //--------------------------------------------------------------------- // Helper methods //--------------------------------------------------------------------- @Override protected void setStyleByName(String styleName) { style = skin.get(styleName, Style.class); } @Override protected void applyStyle() { for(Cell cell : levelsTable.getCells()) { LevelButton button = (LevelButton) cell.getWidget(); if (button != null) { button.setStyle(style.button); } cell.width(style.buttonWidth).height(style.buttonHeight).pad(style.buttonPad); } } private void updateButtonState(LevelButton button) { int levelIndex = button.getLevelIndex(); // disable button if its level number isn't first and there is no prefs for previous levels if (levelIndex == 1 || preferences.containsLives(levelIndex - 1)) { button.setColor(1f, 1f, 1f, 1f); button.setDisabled(false); // update the "star" rating int levelRating = getRatingByScore(levelIndex); button.setRating(levelRating); // update default level index if (defaultLevelIndex < levelIndex) { defaultLevelIndex = levelIndex; } } else { button.setColor(1f, 1f, 1f, 0.35f); button.setDisabled(true); button.setRating(0); } } private int getRatingByScore(int levelIndex) { int score = preferences.getLevelScore(levelIndex); return ScoreUtils.getRatingByScore(score); } //--------------------------------------------------------------------- // Nested Classes //--------------------------------------------------------------------- public static class Style { public LevelButton.Style button; public float buttonWidth; public float buttonHeight; public float buttonPad; } }