どのように私はJavaでGraphics2Dオブジェクトを使用してブレンドモードで四角形を作成することができますか?

ベン・マイヤーズ:

私は、JavaとのシンプルなRPG風のゲームで昼/夜サイクルを作成しようとしています。私はこれをシミュレートするために時間をかけて色合いを変更します低アルファカラーオーバーレイが含まれている点に達しています:

// Render the overlay rectangle.
public void render(Graphics2D g) {

    // Set the color to yellow with ~50% opacity. 
    g.setColor(new Color(255, 255, 0, 125));

    // Draw the rectangle.
    g.fillRect(0, 0, handler.getWidth(), handler.getHeight());

    g.dispose();
}

この作品が、私は昼/夜サイクルのリアリズムを高めるために自分のコードの中に(すなわち、加算、減算、スクリーン、柔らかな光)のブレンドモードを紹介したいと思います。

ここで私が試したものだが、無駄に:

私の希望のコードは、次のものと同様のものですが、私は私が得ることができるものになります。

public void render(Graphics2D g) {

    g.setColor(new Color(255, 255, 0, 125));

    g.setBlendMode(ADD);

    g.fillRect(0, 0, handler.getWidth(), handler.getHeight());

    g.dispose();

}
QuantumDeveloper;

これを解決する一つの可能​​性は、これは間違いなく、それはすべてのハードウェア・アクセラレーションを捨ててこれを行うための高速な方法ではありません(BufferedImageの中で、あなたの画面をバッファリングして、独自の描画メソッドを実装することです。あなたは大画面を描画する必要がある場合これはあなたのシステムと実装に応じラグすることができます)。:

class MyGraphics {
    public enum BlendingMode {
        NORMAL, ADD, …
    }
    public BufferedImage buffer;
    private BlendingMode bm = BlendingMode.NORMAL;
    private int color = 0;
    public MyGraphics(BufferedImage buf) {
        buffer = buf; // Initialize it with a bufferedImage of your panel size.
    }
    public void setBlendMode(BlendingMode b) {
        bm = b;
    }
    private int applyBlendingMode(int imgColor1, int newColor) {
        int rImg, rNew, gImg, gNew, bImg, bNew, alphaImg, alphaNew; // You can intialize those using bitshifts from the color integers.
        switch(bm) {
            // Implement all your blending modes here.
        }
        // And don't forget to return the result!
    }
    public void setColor(int c) {
        color = c;
    }
    public void fillRect(int x0, int y0, int width, int height) {
        for(int x = x0; x < x0+width; x++) {
            for(int y = y0; y < y0+height; y++) {
                buffer.setRGB(x, y, applyBlendingMode(buffer.getRGB(x, y), color));
            }
        }
    }
}

場合setRGBとはgetRGB、あなたのために遅くするために働いている、あなたは上で直接働くことによって、それをスピードアップするかもしれませんBufferedImage(「sのデータアレイの更なる情報についてはこちらを参照します)。

また、あなたは、通常のブレンドモードを使用したい場合、あなたはまだ使用してそれを通常の方法を行うことができますことを、心に留めておくbuffer.getGraphics()あなたの取得するためにGraphicsオブジェクトを。これは、より速く、ほとんどの場合でなければなりません。

あなたは、あなたのブレンディング・モードとより多くのあなたは、単に基礎となる描画することができ、矩形描画するかもしれないいくつかのさらなる機能の実装で行われた後にBufferedImage使用すると、画面上をGraphics.drawImage(buffer, 0, 0);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=371064&siteId=1
おすすめ