Java2D свет с AlphaComposite и цвет - PullRequest
0 голосов
/ 04 ноября 2018

ПРИМЕЧАНИЕ: Если что-то неясно и мешает вам ответить, пожалуйста, напишите комментарий и дайте мне знать!

Я пытаюсь создать свет в своем игровом движке Java2D (обычная Java - нет OpenGl или что-то в этом роде), и он работает нормально, но свет только белый, даже когда я даю ему Цвет. Как я создаю свет:

  1. Нарисуй игру
  2. Нарисуйте черный прямоугольник над всем
  3. Установите Composite для Graphics2D на AlphaComposite.getInstance(AlphaComposite.DST_OUT, compositeAlpha), где compositeAlpha - это пользовательское значение с плавающей точкой от 0f до 1f.
  4. Нарисуйте некоторые вещи в цвете.

Что происходит, так это то, что то, что я рисую после установки композита, обрезает черный прямоугольник, и вы можете видеть материал под ним. Красный маленький круг и белый большой круг с RadialGradientPaint. Проблема очевидна; красный круг в правом верхнем углу не красный .

Вот как я это делаю:

private void updateLightMap() {
    Graphics2D graphics = lightMap.createGraphics();
    graphics.clearRect(0, 0, lightMap.getWidth(), lightMap.getHeight());
    graphics.setColor(lightMapColor);
    graphics.fillRect(0, 0, lightMap.getWidth(), lightMap.getHeight());
    Composite oldComp = graphics.getComposite();
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OUT, compositeAlpha));

    graphics.setRenderingHints(Game.getHost().getRenderHints());

    lights.forEach(light -> light.draw(graphics));

    graphics.setComposite(oldComp);
    graphics.dispose();
}

@Override
public void draw(SaltyGraphics saltyGraphics) {
    updateLightMap();
    saltyGraphics.drawImage(lightMap, Vector2f.zero());
}

Как я рисую круги:

@Override
public void draw(Graphics2D graphics2D) {
    graphics2D.setColor(lightColor);
    graphics2D.setPaint(ColorUtil.createRadialGradientPaint(getTransform(), lightColor, targetAlpha));
    graphics2D.fillOval(Math.round(getX()), Math.round(getY()), Math.round(getWidth()), Math.round(getHeight()));
}

С, для одного, lightColor - белый, для другого - красный.

Я использую неправильный AlphaComposite? С AlphaComposite.SrcOver красный круг красный, но вы больше не можете видеть лежащие в основе вещи.

Полный код на github (https://github.com/edgelord314/salty-engine/tree/light), соответствующие классы:

  1. Scene в de.edgelord.saltyengine.scene (последние строки просмотра метода draw(SaltyGraphics))
  2. LightSystem in de.edgelord.saltyengine.cosmetic.light
  3. Light в de.edgelord.saltyengine.cosmetic.light
  4. PointLight in de.edgelord.saltyengine.cosmetic.light
...