具有AlphaComposite和颜色的Java2D光源

时间:2018-11-04 11:53:34

标签: java awt game-engine java-2d light

注意::如果有任何不清楚的地方并使您无法回答,请发表评论并让我知道!

我正在尝试在Java2D游戏引擎(普通Java-没有OpenGl之类的东西)中创建灯光,并且效果很好,但是即使我给它加了颜色,灯光也只能是白色。 我创造光的方式:

  1. 画游戏
  2. 在所有内容上绘制一个黑色矩形
  3. Composite中的Graphics2D设置为AlphaComposite.getInstance(AlphaComposite.DST_OUT, compositeAlpha),其中compositeAlpha是介于0f和1f之间的自定义浮点数。
  4. 用颜色绘制一些东西。

发生的事情是,设置合成后,我绘制的内容从黑色矩形中切出,您可以看到其下方的内容。 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)上完成代码,相关类:

  1. Scene中的de.edgelord.saltyengine.scene(方法draw(SaltyGraphics)的最后一条视图线)
  2. LightSystem中的{li> de.edgelord.saltyengine.cosmetic.light
  3. Light中的{li> de.edgelord.saltyengine.cosmetic.light
  4. PointLight中的{li> de.edgelord.saltyengine.cosmetic.light

0 个答案:

没有答案