私は、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();
}
この作品が、私は昼/夜サイクルのリアリズムを高めるために自分のコードの中に(すなわち、加算、減算、スクリーン、柔らかな光)のブレンドモードを紹介したいと思います。
ここで私が試したものだが、無駄に:
- JavaFXの研究者のブレンドモードオプションを。私はJavaFXのに切り替えるにはしたくありません。
- 全白の画像を作成するオーバーレイ画面と使用していること
setComposite()
やsetXORMode()
から別のStackOverflowの答え。 - で画像を使用
BlendingMode
してsetComposite()
、パッケージからorg.jdesktop.swingx.graphics.BlendComposite。
私の希望のコードは、次のものと同様のものですが、私は私が得ることができるものになります。
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();
}
これを解決する一つの可能性は、これは間違いなく、それはすべてのハードウェア・アクセラレーションを捨ててこれを行うための高速な方法ではありません(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);