1

RadialGradientPaint を使用してクリクル グラデーションを作成し、それを BufferedImage に配置して、2D ゲーム画面の上に Image をレンダリングし、素敵な光の中の暗闇の効果を作成しています。ただし、より多くの光源を作成したいのですが、各ライトに対して新しい BufferedImage を作成してレンダリングしてもうまくいきません (通常、最後のライトだけが表示され、それ以外はすべて黒です)。いくつかの RadialGradientPaints を 1 つの BufferedImage に焼き付けたり、他の方法で複数のライト効果を実現したりすることは可能ですか?

添付の画像は、1 つのライトがどのように見えるかを示しています。これは、RadialGradientPaint が適用されて画面の上にレンダリングされた黒い BufferedImage です。これをどうにかして増やしていきたいです。

シングルライト

4

2 に答える 2

2

この問題の解決策はこれを使用することです(@JanDvorakによるコメントで指摘されているように:2つの画像をマージする

私が使用する正確なコードは次のとおりです。

public static BufferedImage mergeImages2(BufferedImage base, Collection<Light> images) {
    BufferedImage output = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = output.createGraphics();
    g.drawImage(base, 0, 0, null);
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1.0f));
    for (Light l : images) {
        g.drawImage(l.LIGHT_IMAGE, l.x, l.y, null);
        l.LIGHT_IMAGE.flush();
    }
    g.dispose();
    output.flush();
    return output;
}

注: これで問題は解決しますが、メモリ リークが発生します

于 2012-11-23T12:11:02.590 に答える
0

これを行う別の方法は、2 つのパスを使用して、イメージを別の方法でブレンドすることです。最初のパスでは、白 - 緑 - 透明度から、黒い四角形に複数の放射点を追加するだけです。

次に、同じポイントで、ステップ 1 の最初の画像を XOR ブレンディングで掘り下げました。

結果:

http://img11.imageshack.us/img11/7066/step3yr.png

コード:

public void creerLightMap(){
        lightMap = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = lightMap.createGraphics();
         g.setColor(Color.BLACK);
         g.fillRect(0, 0, this.getWidth(), this.getHeight());
         float radius = 100;
         //create color circle
         for(int i=0; i<lumiere.size(); i++){
            Point2D center = lumiere.get(i);
            float[] dist = {0.0f, 0.5f, 1.0f};
            Color[] colors = {new Color( 1.0f , 1.0f , 1.0f , 1.0f), new Color( 0.0f , 1.0f , 0.0f , 0.5f) , new Color( 0.0f , 1.0f , 0.0f , 0.0f)};
            RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors);
            g.setPaint(p);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
        }

         //add an alpha into theses same circle
         for(int i=0; i<lumiere.size(); i++){
            Point2D center = lumiere.get(i);
            float[] dist = {0.0f, 1.0f};
            Color[] colors = {new Color( 1.0f , 1.0f , 1.0f , 1.0f) , new Color( 1.0f , 1.0f , 1.0f , 0.0f)};
            RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.XOR, 1.0f));
            g.setPaint(p);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
         }
         g.dispose();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.drawImage(this.lightMap, 0, 0, null);
    }
于 2013-03-27T17:38:41.933 に答える