【发布时间】:2020-06-19 02:32:19
【问题描述】:
感谢阅读!
我一直希望在我的简单 2D Java 游戏中使用光照,最后我想出了/找到了一些我在游戏中实现的代码。一切正常,但未点亮的区域完全是黑色的,我想要更清楚地看到灰色的黑暗。所以我认为这很简单,我将 alpha 从 255 更改为 200,但没有任何改变。我将其更改为 1,这创建了我想要的效果,但也创建了一个有趣的其他效果,当我移动灯光时,灯光会停留一段时间,有点像一条小径。但无论如何,我如何改变漆黑以获得更多的 alpha?
Light.java:
private BufferedImage image;
private int x;
private int y;
public Light(int x, int y, int radius, float luminosity) {
this.x = x;
this.y = y;
image = new BufferedImage(radius * 2, radius * 2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) image.getGraphics();
for(int i = 0; i < radius; i++) {
double luma = 1.0D - ((i + 0.001) / radius);
int alpha = Math.min((int)(255.0D * luma * luminosity), 255);
g2.setColor(new Color(0, 0, 0, alpha));
g2.setStroke(new BasicStroke(2));
g2.drawOval(radius - i, radius - i, i * 2, i * 2);
}
}
public void render(Graphics2D g2) {
g2.drawImage(image, (x - image.getWidth() / 2) - Game.instance.cam.getX(), (y - image.getHeight() / 2) - Game.instance.cam.getY(), image.getWidth(), image.getHeight(), null);
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
LightHandler.java:
public BufferedImage lightMap = new BufferedImage(Game.WIDTH, Game.HEIGHT, BufferedImage.TYPE_INT_ARGB);
private ArrayList<Light> lights = new ArrayList<Light>();
public void makeLightMap(BufferedImage lightMap) {
Graphics2D gl = lightMap.createGraphics();
gl.setColor(new Color(0, 0, 0, 255)); // This is the place I thought I should change the Alpha
gl.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
Composite oldComp = gl.getComposite();
gl.setComposite(AlphaComposite.DstOut);
for(Light light : lights) light.render(gl);
gl.setComposite(oldComp);
gl.dispose();
}
public void addLight(Light light) {
lights.add(light);
}
提前致谢!
【问题讨论】: