From 438252a8ca298c83e495c497bcfc5872d15ce38a Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Feb 2025 11:58:42 +0100 Subject: [PATCH] feat: first player progress display --- .../java/gui/menu/MultiPlayerDokuView.java | 4 +++ .../widget/MultiPlayerCompleteProgress.java | 28 +++++++++++++++++++ .../java/gui/widget/SmoothProgressBar.java | 21 ++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 app/src/main/java/gui/widget/MultiPlayerCompleteProgress.java create mode 100644 app/src/main/java/gui/widget/SmoothProgressBar.java diff --git a/app/src/main/java/gui/menu/MultiPlayerDokuView.java b/app/src/main/java/gui/menu/MultiPlayerDokuView.java index b6b09e4..af9bb9b 100644 --- a/app/src/main/java/gui/menu/MultiPlayerDokuView.java +++ b/app/src/main/java/gui/menu/MultiPlayerDokuView.java @@ -2,6 +2,7 @@ package gui.menu; import game.Game; import gui.widget.LeaderboardRenderer; +import gui.widget.MultiPlayerCompleteProgress; import gui.widget.SudokuRenderer; import gui.widget.TimerRenderer; import imgui.ImGui; @@ -16,6 +17,7 @@ public class MultiPlayerDokuView extends BaseView { private final SudokuRenderer sudokuRenderer; private final LeaderboardRenderer leaderboardRenderer; private final TimerRenderer timerRenderer; + private final MultiPlayerCompleteProgress completeProgress; public MultiPlayerDokuView(StateMachine stateMachine, Client client, Server server) { super(stateMachine); @@ -26,6 +28,7 @@ public class MultiPlayerDokuView extends BaseView { this.sudokuRenderer.onCellChange.connect(this::onCellChange); this.client.onDisconnect.connect(this::onDisconnect); this.timerRenderer = new TimerRenderer(this.client.getGame().getStartTime(), Game.GAME_DURATION); + this.completeProgress = new MultiPlayerCompleteProgress(this.client.getGame()); } private void onCellChange(Cell cell) { @@ -42,6 +45,7 @@ public class MultiPlayerDokuView extends BaseView { public void render() { this.timerRenderer.render(); this.leaderboardRenderer.render(); + this.completeProgress.render(); this.sudokuRenderer.render(); if (ImGui.button("Quitter")) { this.client.stop(); diff --git a/app/src/main/java/gui/widget/MultiPlayerCompleteProgress.java b/app/src/main/java/gui/widget/MultiPlayerCompleteProgress.java new file mode 100644 index 0000000..1ea723e --- /dev/null +++ b/app/src/main/java/gui/widget/MultiPlayerCompleteProgress.java @@ -0,0 +1,28 @@ +package gui.widget; + +import game.Game; +import game.Player; +import imgui.ImGui; +import imgui.ImVec2; + +public class MultiPlayerCompleteProgress { + + private final Game game; + private final int emptyCellCount; + private final ImVec2 progressSize = new ImVec2(700, 50); + private final SmoothProgressBar progressBar; + + public MultiPlayerCompleteProgress(Game game) { + this.game = game; + this.emptyCellCount = game.getDoku().getEmptyCells().size(); + this.progressBar = new SmoothProgressBar(); + } + + public void render() { + Player firstPlayer = game.getLeaderboard().get(0); + ImGui.setCursorPosX(ImGui.getIO().getDisplaySizeX() / 2.0f - progressSize.x / 2.0f); + String progressText = firstPlayer.getPseudo() + " - " + firstPlayer.getScore() + "/" + emptyCellCount; + this.progressBar.render(progressText, progressSize, 1.0f - firstPlayer.getScore() / (float) emptyCellCount); + } + +} diff --git a/app/src/main/java/gui/widget/SmoothProgressBar.java b/app/src/main/java/gui/widget/SmoothProgressBar.java new file mode 100644 index 0000000..9db2971 --- /dev/null +++ b/app/src/main/java/gui/widget/SmoothProgressBar.java @@ -0,0 +1,21 @@ +package gui.widget; + +import imgui.ImGui; +import imgui.ImVec2; + +public class SmoothProgressBar { + + private float lastProgress = 0; + private final float speed = 2.0f; + private final float clipConstant = 0.001f; + + public void render(String label, ImVec2 size, float progress) { + float delta = progress - lastProgress; + if (Math.abs(delta) < clipConstant) + lastProgress = progress; + else + lastProgress = lastProgress + delta * ImGui.getIO().getDeltaTime() * speed; + ImGui.progressBar(lastProgress, size, label); + } + +}