@Override public void onTimeOut() { // Disable any further interactions. board.clearSelection(); board.setColoured(true); board.setTouchable(Touchable.disabled); timer.setRunning(false); game.player.playSound(SoundCode.GAME_OVER); // Update the score... and the record. int score = game.getState().getScore(); int time = Math.round(game.getState().getElapsedTime()); game.getPlatform().score().registerScore(score, time); game.getPlatform().score().flushData(); // Save information about this game in the statistics. game.statistics.getTotalData().incrementValue("score", game.getState().getScore()); game.statistics.getTotalData().incrementValue("games"); game.statistics .getTotalData() .incrementValue("time", Math.round(game.getState().getElapsedTime())); game.getPlatform().statistics().saveStatistics(game.statistics); // Mark a combination that the user could do if he had enough time. if (game.getState().getWiggledBounds() == null) { CombinationFinder combo = CombinationFinder.create(game.getState().getBoard()); game.getState().setWiggledBounds(combo.getCombination()); } for (int y = 0; y < game.getState().getBoard().getSize(); y++) { for (int x = 0; x < game.getState().getBoard().getSize(); x++) { if (game.getState().getWiggledBounds() != null && !game.getState().getWiggledBounds().inBounds(x, y)) { board.getBall(x, y).addAction(Actions.color(Color.DARK_GRAY, 0.15f)); } } } // Animate the transition to game over. board.addAction(Actions.delay(2f, board.hideBoard())); hud.addAction(Actions.delay(2f, Actions.fadeOut(0.25f))); // Head to the game over after all these animations have finished. getStage() .addAction( Actions.delay( 2.5f, Actions.run( new Runnable() { @Override public void run() { getStage().getRoot().clearActions(); game.pushScreen(Screens.GAME_OVER); } }))); // Mark the game as finished. game.getState().setTimeout(true); }
private void showPartialScore(int score, Bounds bounds, boolean special) { // Calculate the center of the region. BallActor bottomLeftBall = board.getBall(bounds.minX, bounds.minY); BallActor upperRightBall = board.getBall(bounds.maxX, bounds.maxY); float minX = bottomLeftBall.getX(); float maxX = upperRightBall.getX() + upperRightBall.getWidth(); float minY = bottomLeftBall.getY(); float maxY = upperRightBall.getY() + upperRightBall.getHeight(); float centerX = (minX + maxX) / 2; float centerY = (minY + maxY) / 2; Label label = new Label("+" + score, game.getSkin(), "monospace"); label.setFontScale(5f); label.setSize(140, 70); label.setAlignment(Align.center); label.setPosition(centerX - label.getWidth() / 2, centerY - label.getHeight() / 2); label.addAction(Actions.sequence(Actions.moveBy(0, 80, 0.5f), Actions.removeActor())); getStage().addActor(label); if (special) { label.setColor(Color.CYAN); } }
@Override public void onSelectionSucceeded(final List<BallActor> selection) { // Extract the data from the selection. List<Ball> balls = new ArrayList<>(); for (BallActor selectedBall : selection) balls.add(selectedBall.getBall()); final Bounds bounds = Bounds.fromBallList(balls); // Change the colors of the selected region. board.addAction( Actions.sequence( board.hideRegion(bounds), Actions.run( new Runnable() { @Override public void run() { for (BallActor selectedBall : selection) { selectedBall.setColor(Color.WHITE); } generate(bounds); // Reset the cheat game.getState().setCheatSeen(false); game.getState().setWiggledBounds(null); } }))); // Give some score to the user. ScoreCalculator calculator = new ScoreCalculator(game.getState().getBoard(), bounds); int givenScore = calculator.calculate(); game.getState().addScore(givenScore); score.giveScore(givenScore); // Put information about this combination in the stats. int rows = bounds.maxY - bounds.minY + 1; int cols = bounds.maxX - bounds.minX + 1; String size = Math.max(rows, cols) + "x" + Math.min(rows, cols); game.statistics.getSizesData().incrementValue(size); BallColor color = board.getBall(bounds.minX, bounds.minY).getBall().getColor(); game.statistics.getColorData().incrementValue(color.toString().toLowerCase()); game.statistics.getTotalData().incrementValue("balls", rows * cols); game.statistics.getTotalData().incrementValue("combinations"); // Now, display the score to the user. If the combination is a // PERFECT combination, just display PERFECT. int boardSize = game.getState().getBoard().getSize() - 1; if (bounds.equals(new Bounds(0, 0, boardSize, boardSize))) { // Give score Label label = new Label("PERFECT", game.getSkin(), "monospace"); label.setX((getStage().getViewport().getWorldWidth() - label.getWidth()) / 2); label.setY((getStage().getViewport().getWorldHeight() - label.getHeight()) / 2); label.setFontScale(3); label.setAlignment(Align.center); label.addAction(Actions.sequence(Actions.moveBy(0, 80, 0.5f), Actions.removeActor())); getStage().addActor(label); game.player.playSound(SoundCode.PERFECT); // Give time float givenTime = Constants.SECONDS - timer.getSeconds(); timer.giveTime(givenTime, 4f); } else { // Was special? boolean special = givenScore != rows * cols; // Give score showPartialScore(givenScore, bounds, special); game.player.playSound(SoundCode.SUCCESS); // Give time float givenTime = 4f; timer.giveTime(givenTime, 0.25f); } }