如何在窗格上添加多种灯光效果?
Posted
技术标签:
【中文标题】如何在窗格上添加多种灯光效果?【英文标题】:How to add multiple light effects on a pane? 【发布时间】:2021-05-27 10:38:09 【问题描述】:我对 JavaFX 灯光效果有疑问。我有一个游戏需要在同一个窗格上使用多个点灯,但我还没有设法做到这一点,如果它甚至可能的话。现在我有一个窗格和上面的所有元素。
这似乎是一个不好的方法,所以如果有人知道为 2D 游戏添加光源的更好方法,我将非常感谢您的帮助!
似乎只能将一个灯光效果附加到窗格,因为每当我尝试设置新的灯光效果时,另一个都会被删除。对于这个项目来说,一盏灯是不够的。如果有更好的添加灯光的方法,请告诉我! 也许将灯连接到块上,然后以某种方式使其在窗格上发光? 代码如下:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class game extends Application
@Override
public void start(Stage alku) throws Exception
Pane test=new Pane();
Rectangle box = new Rectangle(200,200);
box.setFill(Color.WHITE);
box.setTranslateX(50);
box.setTranslateY(50);
test.getChildren().add(box);
Rectangle box2 = new Rectangle(200,200);
box2.setFill(Color.WHITE);
box2.setTranslateX(50);
box2.setTranslateY(300);
test.getChildren().add(box2);
Scene scene = new Scene(test,400,400);
Lighting light = new Lighting();
Light.Point l = new Light.Point();
l.xProperty().set(70);
l.yProperty().set(200);
l.setZ(50);
l.setColor(Color.GREEN);
light.setLight(l);
test.setEffect(light);
Lighting light2 = new Lighting();
Light.Point l2 = new Light.Point();
l2.xProperty().set(20);
l2.yProperty().set(200);
l2.setZ(50);
l2.setColor(Color.RED);
light2.setLight(l2);
test.setEffect(light2);
alku.setTitle("light test");
alku.setScene(scene);
alku.show();
public static void main(String[] args)
launch(args);
this is how it looks at the moment
所以“光”被覆盖了。
【问题讨论】:
minimal reproducible example 请.. 我认为你必须创建两个Lighting
实例并将它们组合在一个Blend
中。不过,我对Effect
s 没有太多经验。如果您提供minimal reproducible example,有人可能会为您测试。
@James_D 抱歉帖子太短了。我扩展了它,现在问题应该更清楚了。感谢您的评论,我真的被困在这里,因为我真的想在这里使用照明。
这确实是预期的行为吗?
【参考方案1】:
effect
属性与 Java 中的任何其他属性一样。如果将其设置为一个值,然后立即将其设置为第二个值,它将具有第二个值。
要组合两种效果,请使用Blend
:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.Blend;
import javafx.scene.effect.BlendMode;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Game extends Application
@Override
public void start(Stage alku) throws Exception
Pane test = new Pane();
Rectangle box = new Rectangle(200, 200);
box.setFill(Color.WHITE);
box.setTranslateX(50);
box.setTranslateY(50);
test.getChildren().add(box);
Rectangle box2 = new Rectangle(200, 200);
box2.setFill(Color.WHITE);
box2.setTranslateX(50);
box2.setTranslateY(300);
test.getChildren().add(box2);
Scene scene = new Scene(test, 400, 400);
Lighting light = new Lighting();
Light.Point l = new Light.Point();
l.xProperty().set(70);
l.yProperty().set(200);
l.setZ(50);
l.setColor(Color.GREEN);
light.setLight(l);
//test.setEffect(light);
Lighting light2 = new Lighting();
Light.Point l2 = new Light.Point();
l2.xProperty().set(20);
l2.yProperty().set(200);
l2.setZ(50);
l2.setColor(Color.RED);
light2.setLight(l2);
//test.setEffect(light2);
Blend blend = new Blend(BlendMode.ADD);
blend.setTopInput(light);
blend.setBottomInput(light2);
test.setEffect(blend);
alku.setTitle("light test");
alku.setScene(scene);
alku.show();
public static void main(String[] args)
launch(args);
你基本上可以对任意数量的灯做同样的事情:
Lighting[] lotsOfLights = ... ;
Effect allLights = lotsOfLights[0] ;
for (int i = 1 ; i < lotsOfLights.length ; i++)
allLights = new Blend(BlendMode.ADD, allLights, lotsOfLights[i]);
someNode.setEffect(allLights);
【讨论】:
谢谢@James_D!这是朝着正确方向迈出的一步,但如果我需要超过 2 个灯怎么办?有什么办法可以做到这一点?如果没有,我认为这个问题已经解决了。 @Joku 你可以对任意数量的灯做同样的事情。例如。对于三个灯光,将前两个组合成一个 Blend,然后用第一个 Blend 和第三个灯光创建另一个 Blend,依此类推。 我现在可以将它们全部添加,但有一个副作用会导致整个窗格变白。这是与一盏灯和两盏灯的比较:gyazo.com/4c1867d5e130756c933bb62a6159d959 必须有一个这样做的更好方法.. 对吗? @Joku 据我了解,这是受支持的机制。尝试不同的参数(可能使用不同的混合模式)。 见鬼啊!!!现在就像一个魅力!这完全是关于 topInput 和 bottomInput 的顺序!每次都必须将新的添加到底部,就像在您的代码示例中一样。真是太感谢你了!以上是关于如何在窗格上添加多种灯光效果?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Outlook 2003/2007 的导航窗格(外观栏)中添加新按钮?