注意::如果有任何不清楚的地方并使您无法回答,请发表评论并让我知道!
我正在尝试在Java2D游戏引擎(普通Java-没有OpenGl之类的东西)中创建灯光,并且效果很好,但是即使我给它加了颜色,灯光也只能是白色。 我创造光的方式:
Composite
中的Graphics2D
设置为AlphaComposite.getInstance(AlphaComposite.DST_OUT, compositeAlpha)
,其中compositeAlpha
是介于0f和1f之间的自定义浮点数。发生的事情是,设置合成后,我绘制的内容从黑色矩形中切出,您可以看到其下方的内容。
A red small circle and a white big circle both with a 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
中的{li> de.edgelord.saltyengine.cosmetic.light
Light
中的{li> de.edgelord.saltyengine.cosmetic.light
PointLight
中的{li> de.edgelord.saltyengine.cosmetic.light