From 4b9c0006a6ce161254f9aea476e128f20620752e Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 13 Dec 2025 13:03:50 +0100 Subject: [PATCH] add EnvironmentManager and Lighting classes for enhanced environment rendering --- src/de/miaurizius/jgame2d/core/GamePanel.java | 7 ++ .../environment/EnvironmentManager.java | 24 +++++++ .../jgame2d/environment/Lighting.java | 69 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 src/de/miaurizius/jgame2d/environment/EnvironmentManager.java create mode 100644 src/de/miaurizius/jgame2d/environment/Lighting.java diff --git a/src/de/miaurizius/jgame2d/core/GamePanel.java b/src/de/miaurizius/jgame2d/core/GamePanel.java index 104e2cb..258b1c7 100644 --- a/src/de/miaurizius/jgame2d/core/GamePanel.java +++ b/src/de/miaurizius/jgame2d/core/GamePanel.java @@ -6,6 +6,7 @@ import de.miaurizius.jgame2d.core.enums.Map; import de.miaurizius.jgame2d.core.handlers.*; import de.miaurizius.jgame2d.entity.Entity; import de.miaurizius.jgame2d.entity.Player; +import de.miaurizius.jgame2d.environment.EnvironmentManager; import de.miaurizius.jgame2d.tile.TileManager; import de.miaurizius.jgame2d.tile.interactive.InteractiveTile; @@ -56,6 +57,7 @@ public class GamePanel extends JPanel implements Runnable { public Sound music = new Sound(); public Config config = new Config(this); public PathFinder pFinder = new PathFinder(this); + public EnvironmentManager eManager = new EnvironmentManager(this); Thread gameThread; // ENTITY AND OBJECT @@ -177,6 +179,10 @@ public class GamePanel extends JPanel implements Runnable { for(Entity entity : entityList) entity.draw(fg2); entityList.clear(); + // ENVIRONMENT + eManager.draw(fg2); + + // UI ui.draw(fg2); long drawEnd = System.nanoTime(); @@ -229,6 +235,7 @@ public class GamePanel extends JPanel implements Runnable { assetSetter.setNPC(); assetSetter.setMonster(); assetSetter.setITiles(); + eManager.setup(); gameState = GameState.TITLE; tempScreen = new BufferedImage(screenWidth, screenHeight, BufferedImage.TYPE_INT_RGB); diff --git a/src/de/miaurizius/jgame2d/environment/EnvironmentManager.java b/src/de/miaurizius/jgame2d/environment/EnvironmentManager.java new file mode 100644 index 0000000..da607d7 --- /dev/null +++ b/src/de/miaurizius/jgame2d/environment/EnvironmentManager.java @@ -0,0 +1,24 @@ +package de.miaurizius.jgame2d.environment; + +import de.miaurizius.jgame2d.core.GamePanel; + +import java.awt.*; + +public class EnvironmentManager { + + GamePanel panel; + Lighting lighting; + + public EnvironmentManager(GamePanel panel) { + this.panel = panel; + } + + public void setup() { + lighting = new Lighting(panel, 300); + } + + public void draw(Graphics2D g2) { + lighting.draw(g2); + } + +} diff --git a/src/de/miaurizius/jgame2d/environment/Lighting.java b/src/de/miaurizius/jgame2d/environment/Lighting.java new file mode 100644 index 0000000..591aebd --- /dev/null +++ b/src/de/miaurizius/jgame2d/environment/Lighting.java @@ -0,0 +1,69 @@ +package de.miaurizius.jgame2d.environment; + +import de.miaurizius.jgame2d.core.GamePanel; + +import java.awt.*; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; + +public class Lighting { + + GamePanel panel; + BufferedImage darknessFilter; + + public Lighting(GamePanel panel, int circleSize) { + this.panel = panel; + darknessFilter = new BufferedImage(panel.screenWidth, panel.screenHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = darknessFilter.createGraphics(); + + Area screenArea = new Area(new Rectangle2D.Double(0, 0, panel.screenWidth, panel.screenHeight)); + int centerX = panel.player.screenX + panel.tileSize/2; + int centerY = panel.player.screenY + panel.tileSize/2; + + double x = centerX - (double) circleSize /2; + double y = centerY - (double) circleSize /2; + + Shape circleShape = new Ellipse2D.Double(x, y, circleSize, circleSize); + Area circleArea = new Area(circleShape); + screenArea.subtract(circleArea); + + RadialGradientPaint gPaint = getRadialGradientPaint((float) circleSize, centerX, centerY); + g2.setPaint(gPaint); + + g2.fill(circleArea); + + g2.setColor(new Color(0, 0, 0, 0.95F)); + g2.fill(screenArea); + g2.dispose(); + } + + private static RadialGradientPaint getRadialGradientPaint(float circleSize, int centerX, int centerY) { + Color[] color = new Color[] { + new Color(0, 0, 0, 0.1f), + new Color(0, 0, 0, 0.42f), + new Color(0, 0, 0, 0.52f), + new Color(0, 0, 0, 0.61f), + new Color(0, 0, 0, 0.69f), + new Color(0, 0, 0, 0.76f), + new Color(0, 0, 0, 0.82f), + new Color(0, 0, 0, 0.87f), + new Color(0, 0, 0, 0.91f), + new Color(0, 0, 0, 0.94f), + new Color(0, 0, 0, 0.96f), + new Color(0, 0, 0, 0.97f) + }; + + float[] fraction = new float[] { + 0f, 0.4f, 0.5f, 0.6f, 0.65f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 0.95f, 1f + }; + + return new RadialGradientPaint(centerX, centerY, (circleSize /2), fraction, color); + } + + public void draw(Graphics2D g2) { + g2.drawImage(darknessFilter, 0, 0, null); + } + +}