add EnvironmentManager and Lighting classes for enhanced environment rendering

This commit is contained in:
2025-12-13 13:03:50 +01:00
parent 42ed4dd099
commit 4b9c0006a6
3 changed files with 100 additions and 0 deletions

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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);
}
}