Java 2D игровое освещение, «проблема» с альфой - PullRequest
0 голосов
/ 18 июня 2020

Спасибо за чтение!

Мне всегда хотелось использовать освещение в моих простых 2D java играх, и я, наконец, придумал / нашел код, который я реализовал в своей игре. Это все работает, но область, которая не освещена, полностью черная, я хотел больше видеть сквозь серую sh темноту. Я подумал, что это будет просто, я изменил альфу с 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);
}

Заранее спасибо!

1 Ответ

0 голосов
/ 18 июня 2020

Я решил это сам! Для всех, кому нужно решение: я добавил в свою игру еще один тип света: квадрат с фиксированным альфа-каналом, это именно то, что я хотел!

...