Skip to content

Commit 66b93d3

Browse files
committed
Resolved bug with resetting level progress bar without delay. Added animation for level progress bar updates.
1 parent 0788fb3 commit 66b93d3

File tree

4 files changed

+61
-12
lines changed

4 files changed

+61
-12
lines changed
Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,53 @@
11
package com.dinosaur.dinosaurexploder.components;
22

3+
import com.almasb.fxgl.animation.Interpolators;
4+
import com.almasb.fxgl.dsl.FXGL;
35
import com.almasb.fxgl.entity.component.Component;
46
import com.dinosaur.dinosaurexploder.utils.LevelManager;
57
import javafx.scene.shape.Rectangle;
8+
import javafx.util.Duration;
69

710
/**
811
* Summary:
912
* This class extends Component and handles filling the level progress bar
1013
*/
1114
public class LevelProgressBarComponent extends Component {
15+
private static final double MAX_WIDTH = 148;
16+
private static final Duration UPDATE_DURATION = Duration.seconds(0.3);
17+
private static final Duration RESET_DURATION = Duration.seconds(0.5);
18+
1219
private final Rectangle fill;
13-
private LevelManager levelManager;
20+
private final LevelManager levelManager;
21+
private boolean isLocked = false;
1422

1523
public LevelProgressBarComponent(Rectangle fill, LevelManager levelManager) {
1624
this.fill = fill;
1725
this.levelManager = levelManager;
1826
}
1927

20-
@Override
21-
public void onUpdate(double tpf) {
22-
float progress = levelManager.getLevelProgress();
23-
fill.setWidth(148 * progress);
28+
public void updateProgress() {
29+
if (isLocked) return;
30+
31+
float progress = Math.min(levelManager.getLevelProgress(), 1);
32+
updateWidth(MAX_WIDTH * progress, UPDATE_DURATION);
33+
34+
if (progress >= 1) isLocked = true;
35+
}
36+
37+
public void resetProgress() {
38+
isLocked = false;
39+
40+
float progress = Math.min(levelManager.getLevelProgress(), 1);
41+
updateWidth(MAX_WIDTH * progress, RESET_DURATION);
42+
}
43+
44+
private void updateWidth(double targetWidth, Duration duration) {
45+
FXGL.animationBuilder()
46+
.duration(duration)
47+
.interpolator(Interpolators.EXPONENTIAL.EASE_OUT())
48+
.animate(fill.widthProperty())
49+
.from(fill.getWidth())
50+
.to(targetWidth)
51+
.buildAndPlay();
2452
}
2553
}

src/main/java/com/dinosaur/dinosaurexploder/controller/DinosaurController.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void initGame() {
9292
levelManager = new LevelManager();
9393
initGameEntities();
9494
collisionHandler = new CollisionHandler(levelManager);
95-
bossSpawner = new BossSpawner(settings,levelManager);
95+
bossSpawner = new BossSpawner(settings, levelManager);
9696
CoinSpawner coinSpawner = new CoinSpawner(10, 1.0);
9797

9898
if (!settings.isMuted()) {
@@ -173,7 +173,7 @@ private void resumeEnemySpawning() {
173173
*/
174174
private void showLevelMessage() {
175175
// Hide the progress bar for boss levels
176-
if(levelManager.getCurrentLevel() % 5 == 0) {
176+
if (levelManager.getCurrentLevel() % 5 == 0) {
177177
levelProgressBar.setVisible(false);
178178
}
179179

@@ -200,13 +200,17 @@ private void showLevelMessage() {
200200

201201
// Resume gameplay after a delay
202202
runOnce(() -> {
203-
if(levelManager.getCurrentLevel() % 5 != 0) {
203+
if (levelManager.getCurrentLevel() % 5 != 0) {
204204
levelProgressBar.setVisible(true);
205205
}
206206

207207
getGameScene().removeUINode(levelText);
208208
updateLevelDisplay();
209209

210+
if (levelProgressBar.hasComponent(LevelProgressBarComponent.class)) {
211+
levelProgressBar.getComponent(LevelProgressBarComponent.class).resetProgress();
212+
}
213+
210214
FXGL.getGameWorld().getEntitiesByType(EntityType.GREEN_DINO).forEach(e -> {
211215
if (e.hasComponent(GreenDinoComponent.class)) {
212216
e.getComponent(GreenDinoComponent.class).setPaused(false);
@@ -262,7 +266,9 @@ public void initPhysics() {
262266
}
263267
projectile.removeFromWorld();
264268
greenDino.removeFromWorld();
265-
if (collisionHandler.isLevelUpAfterHitDino(score.getComponent(ScoreComponent.class))) {
269+
if (collisionHandler.isLevelUpAfterHitDino(
270+
score.getComponent(ScoreComponent.class),
271+
levelProgressBar.getComponent(LevelProgressBarComponent.class))) {
266272
showLevelMessage();
267273
System.out.println("Level up!");
268274
}

src/main/java/com/dinosaur/dinosaurexploder/model/CollisionHandler.java

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

33
import com.dinosaur.dinosaurexploder.components.BombComponent;
44
import com.dinosaur.dinosaurexploder.components.CollectedCoinsComponent;
5+
import com.dinosaur.dinosaurexploder.components.LevelProgressBarComponent;
56
import com.dinosaur.dinosaurexploder.components.LifeComponent;
67
import com.dinosaur.dinosaurexploder.components.RedDinoComponent;
78
import com.dinosaur.dinosaurexploder.components.ScoreComponent;
@@ -15,9 +16,10 @@ public CollisionHandler(LevelManager levelManager) {
1516
this.levelManager = levelManager;
1617
}
1718

18-
public boolean isLevelUpAfterHitDino(ScoreComponent scoreComponent) {
19+
public boolean isLevelUpAfterHitDino(ScoreComponent scoreComponent, LevelProgressBarComponent levelProgressBarComponent) {
1920
scoreComponent.incrementScore(1);
2021
levelManager.incrementDefeatedEnemies();
22+
levelProgressBarComponent.updateProgress();
2123

2224
return adjustLevel();
2325
}

src/test/java/com/dinosaur/dinosaurexploder/model/CollisionHandlerTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import com.almasb.fxgl.entity.Entity;
44
import com.dinosaur.dinosaurexploder.components.BombComponent;
55
import com.dinosaur.dinosaurexploder.components.CollectedCoinsComponent;
6+
import com.dinosaur.dinosaurexploder.components.LevelProgressBarComponent;
67
import com.dinosaur.dinosaurexploder.components.LifeComponent;
78
import com.dinosaur.dinosaurexploder.components.RedDinoComponent;
89
import com.dinosaur.dinosaurexploder.components.ScoreComponent;
910
import com.dinosaur.dinosaurexploder.utils.LevelManager;
1011
import com.dinosaur.dinosaurexploder.utils.MockGameTimer;
12+
import javafx.scene.paint.Color;
13+
import javafx.scene.shape.Rectangle;
1114
import org.junit.jupiter.api.BeforeEach;
1215
import org.junit.jupiter.api.Test;
1316
import org.mockito.Mockito;
@@ -34,17 +37,27 @@ void setUp() {
3437
@Test
3538
void projectileHitDino_thenLevelUp() {
3639
ScoreComponent scoreComponent = new ScoreComponent();
40+
Rectangle rect = new Rectangle(0, 8, Color.LIMEGREEN);
41+
LevelProgressBarComponent levelProgressBarComponent = new LevelProgressBarComponent(rect, levelManager) {
42+
@Override
43+
public void updateProgress() {}
44+
};
3745

38-
for (int i = 0; i < LEVEL_UP_COUNT; i++) collisionHandler.isLevelUpAfterHitDino(scoreComponent);
46+
for (int i = 0; i < LEVEL_UP_COUNT; i++) collisionHandler.isLevelUpAfterHitDino(scoreComponent, levelProgressBarComponent);
3947

4048
assertEquals(2, levelManager.getCurrentLevel());
4149
}
4250

4351
@Test
4452
void projectileHitDino_thenScoreIncrease() {
4553
ScoreComponent scoreComponent = new ScoreComponent();
54+
Rectangle rect = new Rectangle(0, 8, Color.LIMEGREEN);
55+
LevelProgressBarComponent levelProgressBarComponent = new LevelProgressBarComponent(rect, levelManager) {
56+
@Override
57+
public void updateProgress() {}
58+
};
4659

47-
collisionHandler.isLevelUpAfterHitDino(scoreComponent);
60+
collisionHandler.isLevelUpAfterHitDino(scoreComponent, levelProgressBarComponent);
4861

4962
assertEquals(1, scoreComponent.getScore());
5063
}

0 commit comments

Comments
 (0)