Java 2D 游戏照明, 'problem' 带 alpha

标签 java 2d lighting

感谢您的阅读!

我一直想在我的简单 2D java 游戏中使用光照,最终我想出了/找到了一些在我的游戏中实现的代码。一切正常,但未照亮的区域完全是黑色的,我想要透过灰色的黑暗看得更清楚。所以我认为这很简单,我将 alpha 从 255 更改为 200,但没有任何变化。我将其更改为 1,这创建了我想要的效果,但也创建了一个有趣的其他效果,当我移动灯光时,灯光会停留一段时间,有点像轨迹。但无论如何,我如何改变漆黑以获得更多的阿尔法?

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

提前致谢!

最佳答案

我自己解决了!对于需要解决方案的每个人:我在我的游戏中添加了另一种类型的光:具有固定 Alpha 的正方形,这正是我想要的!

关于Java 2D 游戏照明, 'problem' 带 alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454775/

相关文章:

java - GLSL 中奇怪的灯光

安卓2D平台游戏

C++ 骰子滚动分析器(2D 数组)

c - 在循环中逐个字符读取二维数组

opengl - GLSL 着色器照明不起作用

java - HashSet 和多线程

java - 使用 Junit 或 Jmock 断言 java beans 数组具有唯一的属性值

java - xml 验证失败,出现需要属性和不允许属性的错误,该错误不明确

java - 类包含子类的一个元素

java - Java/lwjgl 中的 OpenGL 光照问题