From 7b3a8bca0f26ab0aca96e177479d5144d0e4c0b5 Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 13 Dec 2025 14:06:01 +0100 Subject: [PATCH] implement day-night cycle with dynamic lighting adjustments --- .../jgame2d/environment/Lighting.java | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/src/de/miaurizius/jgame2d/environment/Lighting.java b/src/de/miaurizius/jgame2d/environment/Lighting.java index 3bb3b8b..71f754d 100644 --- a/src/de/miaurizius/jgame2d/environment/Lighting.java +++ b/src/de/miaurizius/jgame2d/environment/Lighting.java @@ -9,6 +9,9 @@ public class Lighting { GamePanel panel; BufferedImage darknessFilter; + int dayCount; + float filterAlpha; + DayState dayState = DayState.DAY; public Lighting(GamePanel panel) { this.panel = panel; @@ -16,12 +19,59 @@ public class Lighting { } public void draw(Graphics2D g2) { + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, filterAlpha)); g2.drawImage(darknessFilter, 0, 0, null); + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1F)); + + // DEBUG + String s; + switch (dayState) { + case DAY -> s = "DAY"; + case DUSK -> s = "DUSK"; + case NIGHT -> s = "NIGHT"; + case DAWN -> s = "DAWN"; + default -> s = "UNKNOWN"; + } + g2.setColor(Color.white); + g2.setFont(g2.getFont().deriveFont(50f)); + g2.drawString(s, 800, 500); } public void update() { - if(!panel.player.lightUpdated) return; - setLightSource(); - panel.player.lightUpdated = false; + if(panel.player.lightUpdated) { + setLightSource(); + panel.player.lightUpdated = false; + } + + switch (dayState) { + case DAY -> { + dayCount++; + if (dayCount > 600) { //10 seconds + dayState = DayState.DUSK; + dayCount = 0; + } + } + case DUSK -> { + filterAlpha += 0.001f; + if (filterAlpha > 1f) { + filterAlpha = 1f; + dayState = DayState.NIGHT; + } + } + case NIGHT -> { + dayCount++; + if (dayCount > 600) { //10 seconds + dayState = DayState.DAWN; + dayCount = 0; + } + } + case DAWN -> { + filterAlpha -= 0.001f; + if (filterAlpha < 0f) { + filterAlpha = 0f; + dayState = DayState.DAY; + } + } + } } // ... @@ -69,4 +119,11 @@ public class Lighting { return new RadialGradientPaint(centerX, centerY, (panel.player.currentLight == null ? 75 : panel.player.currentLight.lightRadius), fraction, color); } + public enum DayState { + DAY, + DUSK, + NIGHT, + DAWN, + } + }