ПРИМЕЧАНИЕ: Если что-то неясно и мешает вам ответить, пожалуйста, напишите комментарий и дайте мне знать!
Я пытаюсь создать свет в своем игровом движке Java2D (обычная Java - нет OpenGl или что-то в этом роде), и он работает нормально, но свет только белый, даже когда я даю ему Цвет.
Как я создаю свет:
- Нарисуй игру
- Нарисуйте черный прямоугольник над всем
- Установите
Composite
для Graphics2D
на AlphaComposite.getInstance(AlphaComposite.DST_OUT, compositeAlpha)
, где compositeAlpha
- это пользовательское значение с плавающей точкой от 0f до 1f.
- Нарисуйте некоторые вещи в цвете.
Что происходит, так это то, что то, что я рисую после установки композита, обрезает черный прямоугольник, и вы можете видеть материал под ним.
Красный маленький круг и белый большой круг с 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), соответствующие классы:
Scene
в de.edgelord.saltyengine.scene
(последние строки просмотра метода draw(SaltyGraphics)
)
LightSystem
in de.edgelord.saltyengine.cosmetic.light
Light
в de.edgelord.saltyengine.cosmetic.light
PointLight
in de.edgelord.saltyengine.cosmetic.light