Skip to content
This repository was archived by the owner on Dec 24, 2025. It is now read-only.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

import com.almasb.fxgl.app.GameApplication;
import com.almasb.fxgl.app.GameSettings;
import com.github.codestorm.bounceverse.systems.init.*;
import com.github.codestorm.bounceverse.systems.init.AppEventSystem;
import com.github.codestorm.bounceverse.systems.init.GameSystem;
import com.github.codestorm.bounceverse.systems.init.InputSystem;
import com.github.codestorm.bounceverse.systems.init.PhysicSystem;
import com.github.codestorm.bounceverse.systems.init.UISystem;
import com.github.codestorm.bounceverse.systems.manager.settings.GameSettingsManager;
import com.github.codestorm.bounceverse.systems.manager.settings.LaunchOptionsManager;
import com.github.codestorm.bounceverse.systems.manager.settings.UserSettingsManager;
Expand Down
113 changes: 107 additions & 6 deletions src/main/java/com/github/codestorm/bounceverse/scenes/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,39 @@
import com.almasb.fxgl.scene.SubScene;
import com.almasb.fxgl.ui.FXGLScrollPane;
import com.almasb.fxgl.ui.FontType;
import com.github.codestorm.bounceverse.systems.manager.metrics.LeaderboardManager;

import javafx.animation.FadeTransition;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Tooltip;
import javafx.scene.effect.BlendMode;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
Expand All @@ -58,7 +76,9 @@
import javafx.util.StringConverter;

import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;

/**
Expand Down Expand Up @@ -381,7 +401,12 @@ private MenuBox createExtraMenu() {
var itemCredits = new MenuButton("menu.credits");
itemCredits.setMenuContent(this::createContentCredits);

return new MenuBox(itemAchievements, itemCredits);
var itemLeaderboard = new MenuButton("temp.key");
itemLeaderboard.btn.textProperty().unbind();
itemLeaderboard.btn.setText("LEADERBOARD");
itemLeaderboard.setMenuContent(this::createContentLeaderboard);

return new MenuBox(itemAchievements, itemCredits, itemLeaderboard);
}

private void switchMenuTo(Node menuNode) {
Expand Down Expand Up @@ -704,6 +729,80 @@ protected MenuContent createContentAchievements() {
return content;
}

protected MenuContent createContentLeaderboard() {
log.debug("createContentLeaderboard()");

var leaderboardManager = LeaderboardManager.getInstance();
leaderboardManager.reload();

var blitzScores = leaderboardManager.getEndlessLeaderboard();

var contentBox = new VBox(20);
contentBox.setAlignment(Pos.TOP_CENTER);

var title =
FXGL.getUIFactoryService()
.newText("LEADERBOARD", Color.ORANGE, FontType.MONO, 27.0);

var grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(30);
grid.setVgap(10);

grid.getColumnConstraints()
.add(new ColumnConstraints(60, 60, 60, Priority.ALWAYS, HPos.CENTER, true)); // Rank
grid.getColumnConstraints()
.add(
new ColumnConstraints(
200, 200, 200, Priority.ALWAYS, HPos.LEFT, true)); // Name
grid.getColumnConstraints()
.add(
new ColumnConstraints(
150, 150, 150, Priority.ALWAYS, HPos.RIGHT, true)); // Score

grid.addRow(
0,
FXGL.getUIFactoryService().newText("Rank", Color.NAVAJOWHITE, FontType.MONO, 21.0),
FXGL.getUIFactoryService()
.newText("Player", Color.NAVAJOWHITE, FontType.MONO, 21.0),
FXGL.getUIFactoryService()
.newText("Score", Color.NAVAJOWHITE, FontType.MONO, 21.0));

int rank = 1;
if (blitzScores.isEmpty()) {
var noDataText =
FXGL.getUIFactoryService()
.newText("No data available.", Color.GRAY, FontType.UI, 16.0);
grid.add(noDataText, 0, 1);
GridPane.setColumnSpan(noDataText, 3);
} else {
for (var score : blitzScores) {
grid.addRow(
rank,
FXGL.getUIFactoryService()
.newText("#" + rank, Color.YELLOW, FontType.MONO, 18.0),
FXGL.getUIFactoryService()
.newText(score.name(), Color.CYAN, FontType.MONO, 18.0),
FXGL.getUIFactoryService()
.newText(
String.valueOf(score.score()),
Color.LIGHTGREEN,
FontType.MONO,
18.0));
rank++;
}
}

var scrollPane = new FXGLScrollPane(grid);
scrollPane.setPrefHeight(getAppHeight() / 2.0);
scrollPane.setPrefWidth(500);
scrollPane.setStyle("-fx-background: black;");

contentBox.getChildren().addAll(title, scrollPane);

return new MenuContent(contentBox);
}

private void showProfileDialog() {
ChoiceBox<String> profilesBox =
FXGL.getUIFactoryService().newChoiceBox(FXCollections.observableArrayList());
Expand Down Expand Up @@ -818,7 +917,9 @@ public MenuButton(String stringKey) {
btn.setAlignment(Pos.CENTER_LEFT);
btn.setStyle("-fx-background-color: transparent");

final var p = new Polygon(0.0, 0.0, 220.0, 0.0, 250.0, 35.0, 0.0, 35.0);
btn.setPrefWidth(280);

final var p = new Polygon(0.0, 0.0, 270.0, 0.0, 300.0, 35.0, 0.0, 35.0);
p.setMouseTransparent(true);

var g =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.almasb.fxgl.core.serialization.Bundle;
import com.almasb.fxgl.logging.Logger;
import com.github.codestorm.bounceverse.typing.records.BlitzScore;
import com.github.codestorm.bounceverse.typing.records.EndlessScore;
import com.github.codestorm.bounceverse.typing.structures.BoundedTreeSet;

Expand All @@ -25,7 +24,6 @@
public final class LeaderboardManager extends MetricsManager {
public static final int MAX_SIZE = 10;
public static final String FILENAME = "leaderboard.dat";
private static final String BLITZ = "blitz";
private static final String ENDLESS = "endless";

public static LeaderboardManager getInstance() {
Expand All @@ -40,14 +38,10 @@ public void reload() {
final var bundle = (Bundle) ois.readObject();

final BoundedTreeSet<EndlessScore> endlessLB = bundle.get(ENDLESS);
final BoundedTreeSet<BlitzScore> blitzLB = bundle.get(BLITZ);

endlessLeaderboard.clear();
endlessLeaderboard.addAll(endlessLB);

blitzLeaderboard.clear();
blitzLeaderboard.addAll(blitzLB);

Logger.get(LeaderboardManager.class)
.infof("Loaded leaderboard from: %s", file.getAbsolutePath());

Expand All @@ -60,7 +54,6 @@ public void reload() {
/** Lưu lại BXH. */
public void save() {
final var leaderboard = new Bundle("leaderboard");
leaderboard.put(BLITZ, blitzLeaderboard);
leaderboard.put(ENDLESS, endlessLeaderboard);

try {
Expand All @@ -79,15 +72,9 @@ private LeaderboardManager() {
reload();
}

private final BoundedTreeSet<BlitzScore> blitzLeaderboard =
new BoundedTreeSet<>(MAX_SIZE, Comparator.reverseOrder());
private final BoundedTreeSet<EndlessScore> endlessLeaderboard =
new BoundedTreeSet<>(MAX_SIZE, Comparator.reverseOrder());

public BoundedTreeSet<BlitzScore> getBlitzLeaderboard() {
return blitzLeaderboard;
}

public BoundedTreeSet<EndlessScore> getEndlessLeaderboard() {
return endlessLeaderboard;
}
Expand Down

This file was deleted.

Loading