创建一个;影子“;JavaFX中画布的图层?

创建一个;影子“;JavaFX中画布的图层?,java,javafx,graphics,Java,Javafx,Graphics,我目前正在使用JavaFX重新制作几年前在Swing/AWT中制作的游戏。我目前的困境是,最初的游戏有一个“手电筒”,我首先创建了一个空白的黑色图层,然后在上面创建一个多边形,并使用混合模式从该图层中减去它。从那里开始,图层以透明的方式绘制,以显示一切都是黑暗的,玩家有一个手电筒 我很难弄清楚如何在JavaFX中实现这一点。我想我可以创建一个空白的黑色图像,有办法创建一个GraphicsContext,我可以设置一个混合模式从图像中减去,但是图像在JavaFX中不支持这种渲染,事实上,Writa

我目前正在使用JavaFX重新制作几年前在Swing/AWT中制作的游戏。我目前的困境是,最初的游戏有一个“手电筒”,我首先创建了一个空白的黑色图层,然后在上面创建一个多边形,并使用混合模式从该图层中减去它。从那里开始,图层以透明的方式绘制,以显示一切都是黑暗的,玩家有一个手电筒

我很难弄清楚如何在JavaFX中实现这一点。我想我可以创建一个空白的黑色图像,有办法创建一个GraphicsContext,我可以设置一个混合模式从图像中减去,但是图像在JavaFX中不支持这种渲染,事实上,WritableImage是一个单独的类,只允许使用PixelWriter,我必须手动设置每个像素

我知道关于JavaFX可能还有很多我仍然不了解的地方,因为我以前只使用它开发了一些应用程序。有人对如何实现此功能有什么建议吗?如果我能让它看起来比原来的好就好了

这里有一张旧游戏的图片供参考


当绘制所有游戏实体和HUD时,我能够通过在两者之间绘制黑色层来实现类似于我所寻找的东西。我用80%的不透明度绘制它,然后我用5%的不透明度和混合模式SRC_OVER绘制我的手电筒多边形。使用不同的混合模式需要花费大量的时间,但倍增绝对不是一个好办法。

我创建了两个画布,“明亮世界”画布和第二个“夜间叠加”画布,其中只有一个夜间灰色矩形和灯光图像。 如果我想在游戏中加入夜晚,我会用Blendmode.MULTIPLY添加夜晚画布

在这里,我创建了夜间覆盖:(简化)

创建夜间图层a后,每个渲染周期将其添加到窗格中:

root.getChildren().clear();//root-Pane
root.getChildren().add(worldCanvas);//The world with all sprites
//LightMap
if (shadowColor != null) {//To switch on/off night
    renderLightEffect(currentNanoTime);//update of the positions of the light points
root.getChildren().add(shadowMask);//grey Canvas with some light points
shadowMask.setBlendMode(BlendMode.MULTIPLY);//Here is the magic merge the colors
    }
编辑:后来我意识到,双画布方法不利于性能。我建议直接在世界画布上绘制阴影层

结果:


我真的很希望有更好的方法用JavaFX实现这种效果,但我想我应该很高兴这是可能的。我知道JavaFX不是用来玩游戏的。我很感谢你的努力,但这个问题已经问了将近4年了,我不仅迁移到了Slick2D,而且一年前我就停止了游戏的开发。我知道这对你来说太晚了,但我希望它能在将来帮助其他人。
root.getChildren().clear();//root-Pane
root.getChildren().add(worldCanvas);//The world with all sprites
//LightMap
if (shadowColor != null) {//To switch on/off night
    renderLightEffect(currentNanoTime);//update of the positions of the light points
root.getChildren().add(shadowMask);//grey Canvas with some light points
shadowMask.setBlendMode(BlendMode.MULTIPLY);//Here is the magic merge the colors
    }