Saya memiliki masalah dengan efek cahaya JavaFX. Saya memiliki permainan yang membutuhkan banyak lampu titik pada panel yang sama, tetapi saya belum berhasil melakukannya, jika memungkinkan. Saat ini saya memiliki panel dan semua elemen di atasnya.

Ini sepertinya metode yang buruk, jadi jika seseorang tahu cara yang lebih baik untuk menambahkan sumber cahaya untuk game 2D, saya akan sangat menghargai bantuannya!

Tampaknya juga hanya satu efek cahaya yang dapat dilampirkan ke panel, karena setiap kali saya mencoba mengatur yang baru, yang lain akan dihapus. Satu lampu saja tidak cukup untuk proyek ini. Jika ada cara yang lebih baik untuk menambahkan lampu, beri tahu saya! Mungkin memasang lampu ke balok dan entah bagaimana membuatnya bersinar di panel? Berikut kodenya:

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); 
    }


}


    

beginilah tampilannya saat ini

Jadi "cahaya" akan ditimpa.

0
Joku 27 Mei 2021, 13:38

1 menjawab

Jawaban Terbaik

Properti effect adalah properti seperti properti lainnya di Java. Jika Anda mengaturnya ke satu nilai, dan kemudian segera mengaturnya ke nilai kedua, itu akan memiliki nilai kedua.

Untuk menggabungkan dua efek, gunakan 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);
    }

}

Anda pada dasarnya dapat melakukan hal yang sama untuk jumlah lampu yang berubah-ubah:

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);
0
James_D 27 Mei 2021, 20:33