Skip to content
This repository was archived by the owner on Dec 24, 2025. It is now read-only.

Commit 2012363

Browse files
authored
Merge pull request #26 from CodeStormOOP/feature/leaderboard
feat: leaderboard
2 parents 75b0143 + 465a6e9 commit 2012363

4 files changed

Lines changed: 112 additions & 39 deletions

File tree

src/main/java/com/github/codestorm/bounceverse/Bounceverse.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
import com.almasb.fxgl.app.GameApplication;
44
import com.almasb.fxgl.app.GameSettings;
5-
import com.github.codestorm.bounceverse.systems.init.*;
5+
import com.github.codestorm.bounceverse.systems.init.AppEventSystem;
6+
import com.github.codestorm.bounceverse.systems.init.GameSystem;
7+
import com.github.codestorm.bounceverse.systems.init.InputSystem;
8+
import com.github.codestorm.bounceverse.systems.init.PhysicSystem;
9+
import com.github.codestorm.bounceverse.systems.init.UISystem;
610
import com.github.codestorm.bounceverse.systems.manager.settings.GameSettingsManager;
711
import com.github.codestorm.bounceverse.systems.manager.settings.LaunchOptionsManager;
812
import com.github.codestorm.bounceverse.systems.manager.settings.UserSettingsManager;

src/main/java/com/github/codestorm/bounceverse/scenes/Menu.java

Lines changed: 107 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,39 @@
3131
import com.almasb.fxgl.scene.SubScene;
3232
import com.almasb.fxgl.ui.FXGLScrollPane;
3333
import com.almasb.fxgl.ui.FontType;
34+
import com.github.codestorm.bounceverse.systems.manager.metrics.LeaderboardManager;
3435

3536
import javafx.animation.FadeTransition;
3637
import javafx.beans.binding.Bindings;
3738
import javafx.beans.property.SimpleObjectProperty;
3839
import javafx.collections.FXCollections;
3940
import javafx.event.ActionEvent;
4041
import javafx.event.EventHandler;
41-
import javafx.geometry.*;
42+
import javafx.geometry.HPos;
43+
import javafx.geometry.Insets;
44+
import javafx.geometry.Point2D;
45+
import javafx.geometry.Pos;
46+
import javafx.geometry.VPos;
4247
import javafx.scene.Node;
43-
import javafx.scene.control.*;
48+
import javafx.scene.control.Button;
49+
import javafx.scene.control.CheckBox;
50+
import javafx.scene.control.ChoiceBox;
51+
import javafx.scene.control.ListCell;
52+
import javafx.scene.control.ListView;
53+
import javafx.scene.control.ScrollPane;
54+
import javafx.scene.control.Tooltip;
4455
import javafx.scene.effect.BlendMode;
4556
import javafx.scene.effect.GaussianBlur;
4657
import javafx.scene.input.KeyEvent;
4758
import javafx.scene.input.MouseEvent;
48-
import javafx.scene.layout.*;
59+
import javafx.scene.layout.ColumnConstraints;
60+
import javafx.scene.layout.GridPane;
61+
import javafx.scene.layout.HBox;
62+
import javafx.scene.layout.Pane;
63+
import javafx.scene.layout.Priority;
64+
import javafx.scene.layout.RowConstraints;
65+
import javafx.scene.layout.StackPane;
66+
import javafx.scene.layout.VBox;
4967
import javafx.scene.paint.Color;
5068
import javafx.scene.paint.CycleMethod;
5169
import javafx.scene.paint.LinearGradient;
@@ -58,7 +76,9 @@
5876
import javafx.util.StringConverter;
5977

6078
import java.time.format.DateTimeFormatter;
61-
import java.util.*;
79+
import java.util.ArrayList;
80+
import java.util.List;
81+
import java.util.Set;
6282
import java.util.function.Supplier;
6383

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

384-
return new MenuBox(itemAchievements, itemCredits);
404+
var itemLeaderboard = new MenuButton("temp.key");
405+
itemLeaderboard.btn.textProperty().unbind();
406+
itemLeaderboard.btn.setText("LEADERBOARD");
407+
itemLeaderboard.setMenuContent(this::createContentLeaderboard);
408+
409+
return new MenuBox(itemAchievements, itemCredits, itemLeaderboard);
385410
}
386411

387412
private void switchMenuTo(Node menuNode) {
@@ -704,6 +729,80 @@ protected MenuContent createContentAchievements() {
704729
return content;
705730
}
706731

732+
protected MenuContent createContentLeaderboard() {
733+
log.debug("createContentLeaderboard()");
734+
735+
var leaderboardManager = LeaderboardManager.getInstance();
736+
leaderboardManager.reload();
737+
738+
var blitzScores = leaderboardManager.getEndlessLeaderboard();
739+
740+
var contentBox = new VBox(20);
741+
contentBox.setAlignment(Pos.TOP_CENTER);
742+
743+
var title =
744+
FXGL.getUIFactoryService()
745+
.newText("LEADERBOARD", Color.ORANGE, FontType.MONO, 27.0);
746+
747+
var grid = new GridPane();
748+
grid.setAlignment(Pos.CENTER);
749+
grid.setHgap(30);
750+
grid.setVgap(10);
751+
752+
grid.getColumnConstraints()
753+
.add(new ColumnConstraints(60, 60, 60, Priority.ALWAYS, HPos.CENTER, true)); // Rank
754+
grid.getColumnConstraints()
755+
.add(
756+
new ColumnConstraints(
757+
200, 200, 200, Priority.ALWAYS, HPos.LEFT, true)); // Name
758+
grid.getColumnConstraints()
759+
.add(
760+
new ColumnConstraints(
761+
150, 150, 150, Priority.ALWAYS, HPos.RIGHT, true)); // Score
762+
763+
grid.addRow(
764+
0,
765+
FXGL.getUIFactoryService().newText("Rank", Color.NAVAJOWHITE, FontType.MONO, 21.0),
766+
FXGL.getUIFactoryService()
767+
.newText("Player", Color.NAVAJOWHITE, FontType.MONO, 21.0),
768+
FXGL.getUIFactoryService()
769+
.newText("Score", Color.NAVAJOWHITE, FontType.MONO, 21.0));
770+
771+
int rank = 1;
772+
if (blitzScores.isEmpty()) {
773+
var noDataText =
774+
FXGL.getUIFactoryService()
775+
.newText("No data available.", Color.GRAY, FontType.UI, 16.0);
776+
grid.add(noDataText, 0, 1);
777+
GridPane.setColumnSpan(noDataText, 3);
778+
} else {
779+
for (var score : blitzScores) {
780+
grid.addRow(
781+
rank,
782+
FXGL.getUIFactoryService()
783+
.newText("#" + rank, Color.YELLOW, FontType.MONO, 18.0),
784+
FXGL.getUIFactoryService()
785+
.newText(score.name(), Color.CYAN, FontType.MONO, 18.0),
786+
FXGL.getUIFactoryService()
787+
.newText(
788+
String.valueOf(score.score()),
789+
Color.LIGHTGREEN,
790+
FontType.MONO,
791+
18.0));
792+
rank++;
793+
}
794+
}
795+
796+
var scrollPane = new FXGLScrollPane(grid);
797+
scrollPane.setPrefHeight(getAppHeight() / 2.0);
798+
scrollPane.setPrefWidth(500);
799+
scrollPane.setStyle("-fx-background: black;");
800+
801+
contentBox.getChildren().addAll(title, scrollPane);
802+
803+
return new MenuContent(contentBox);
804+
}
805+
707806
private void showProfileDialog() {
708807
ChoiceBox<String> profilesBox =
709808
FXGL.getUIFactoryService().newChoiceBox(FXCollections.observableArrayList());
@@ -818,7 +917,9 @@ public MenuButton(String stringKey) {
818917
btn.setAlignment(Pos.CENTER_LEFT);
819918
btn.setStyle("-fx-background-color: transparent");
820919

821-
final var p = new Polygon(0.0, 0.0, 220.0, 0.0, 250.0, 35.0, 0.0, 35.0);
920+
btn.setPrefWidth(280);
921+
922+
final var p = new Polygon(0.0, 0.0, 270.0, 0.0, 300.0, 35.0, 0.0, 35.0);
822923
p.setMouseTransparent(true);
823924

824925
var g =

src/main/java/com/github/codestorm/bounceverse/systems/manager/metrics/LeaderboardManager.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.almasb.fxgl.core.serialization.Bundle;
44
import com.almasb.fxgl.logging.Logger;
5-
import com.github.codestorm.bounceverse.typing.records.BlitzScore;
65
import com.github.codestorm.bounceverse.typing.records.EndlessScore;
76
import com.github.codestorm.bounceverse.typing.structures.BoundedTreeSet;
87

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

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

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

4542
endlessLeaderboard.clear();
4643
endlessLeaderboard.addAll(endlessLB);
4744

48-
blitzLeaderboard.clear();
49-
blitzLeaderboard.addAll(blitzLB);
50-
5145
Logger.get(LeaderboardManager.class)
5246
.infof("Loaded leaderboard from: %s", file.getAbsolutePath());
5347

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

6659
try {
@@ -79,15 +72,9 @@ private LeaderboardManager() {
7972
reload();
8073
}
8174

82-
private final BoundedTreeSet<BlitzScore> blitzLeaderboard =
83-
new BoundedTreeSet<>(MAX_SIZE, Comparator.reverseOrder());
8475
private final BoundedTreeSet<EndlessScore> endlessLeaderboard =
8576
new BoundedTreeSet<>(MAX_SIZE, Comparator.reverseOrder());
8677

87-
public BoundedTreeSet<BlitzScore> getBlitzLeaderboard() {
88-
return blitzLeaderboard;
89-
}
90-
9178
public BoundedTreeSet<EndlessScore> getEndlessLeaderboard() {
9279
return endlessLeaderboard;
9380
}

src/main/java/com/github/codestorm/bounceverse/typing/records/BlitzScore.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)