私は単純な2Dゲームで作業しています。それぞれのティック、特定のエフェクト(フェードトランジション、オーディオフェードイン/アウトなど)のためにスレッドを開始するエフェクトキューをチェックしたいと思います。たとえば、メニュー画面で「再生」を押すと、このキューに「FadeOut」というメッセージが追加され、処理され、GamePanel上でアルファ値が増加する黒い四角形を描画するスレッドが開始されます。PaintComponent()の外でJPanelに描画されたBufferedImageをgetGraphics()で上書きする方法
私はpaintComponent()をオーバーライドし、私のグラフィックスを送信していますが(現在の州のドローにGraphicsオブジェクトに沿って通る私のGameStateManager、)に反対します。私は現在、paintComponent()グラフィックスオブジェクトをルーティングするエフェクト状態(おそらく私は)を持っていませんが、自分のゲームパネルを私のエフェクトスレッドに渡して、getGraphics()を使って描くことができます。 gameloopはまだゲームをレンダリングしているので、GamePanelに直接四角形を描画するだけでちらつきが発生します。
私は、私がされたBufferedImageにアルファの増加に伴って黒の四角形を描画することができた、ゲームのパネルの上にBufferedImageを描く(古いを置き換えるために新しい描画を引き起こし)AlphaComposite.Srcに複合を設定します。問題は、ゲームパネルに描画されたBufferedImagesがそれぞれの描画をオーバーライドしないため、さまざまなアルファの黒いBufferedImageが互いに重なり合っているため、フェードアウトが実際に迅速に行われることです。
私は、複合設定をテストし、上書きなっているかを確認するには、この短いプログラムを書きました。すべての描画はdraw()で行われ、これはエフェクトスレッドのrun()です。 「oPanelGraphics」に複合を設定している面白いの
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ScratchPad extends JPanel implements Runnable
{
private JFrame oFrame = null;
private Thread oGameThread = null;
private Graphics2D oPanelGraphics = null;
private Graphics2D oImageGraphics = null;
private BufferedImage oImage = null;
public static void main(String args[]) throws Exception
{
new ScratchPad();
}
public ScratchPad()
{
createFrame();
initPanel();
addAndShowComponents();
oGameThread = new Thread(this, "Game_Loop");
oGameThread.start();
}
private void addAndShowComponents()
{
oFrame.add(this);
oFrame.setVisible(true);
}
private void initPanel()
{
this.setOpaque(true);
this.setBackground(Color.cyan);
}
private void createFrame()
{
oFrame = new JFrame("Fade");
oFrame.setSize(700, 300);
oFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
oFrame.setLocationRelativeTo(null);
}
public void run()
{
oImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
while(true)
{
try
{
draw();
Thread.sleep(100);
}
catch(InterruptedException e)
{
}
}
}
private void draw()
{
oPanelGraphics = (Graphics2D)this.getGraphics();
oImageGraphics = oImage.createGraphics();
oImageGraphics.setComposite(AlphaComposite.Src);
oImageGraphics.setColor(new Color(0,0,0,90));
oImageGraphics.fillRect(0, 0, oImage.getWidth(), oImage.getHeight());
oPanelGraphics.drawImage(oImage, 10, 10, null);
oImageGraphics.setColor(new Color(0,0,0,60));
oImageGraphics.fillRect(0, 0, oImage.getWidth(), oImage.getHeight());
oPanelGraphics.drawImage(oImage, 220, 10, null);
oImageGraphics.setColor(new Color(0,0,0,30));
oImageGraphics.fillRect(0, 0, oImage.getWidth(), oImage.getHeight());
oPanelGraphics.drawImage(oImage, 430, 10, null);
// Drawing this image over location of first image, should overwrite first
// after setting composite to 'Src'
oPanelGraphics.setComposite(AlphaComposite.Src);
oImageGraphics.setColor(new Color(0,0,0,10));
oImageGraphics.fillRect(0, 0, oImage.getWidth(), oImage.getHeight());
oPanelGraphics.drawImage(oImage, 10, 10, null);
oImageGraphics.dispose();
oPanelGraphics.dispose();
}
} // end class
はBufferedImageのに任意のアルファは、以前にあった画像の上に描画されている完全に不透明な黒画像が得られ、離れて行くようになります。黒以外の色に設定しても効果はありません。
何も面白いことにBufferedImageのための複合を設定されています
oImageGraphics.setComposite(AlphaComposite.SrcIn);
は何も示されていないことが原因となります。 「SRCIN」の2Dでの状態でこれをグラフィクスを合成するには、Oracleのマニュアル:
「は、送信元と宛先の重複の画素場合、重複領域内の唯一のソースピクセルがレンダリングされます。」
だから、私はこれは私がAlphaComposite.Srcと得る同じ振る舞いを持つことが期待されます。
たぶんそこに誰かがこれらの複合体で起こっていただきました上でいくつかの光を当てることができ、そしてどのように私は私の所望の効果を達成できます。
このdraw()メソッドではなく、パネルのonDraw(Graphics g2d)をオーバーライドしますか? –
@MarcosVasconcelosはい、それは私が現在やっていることです。しかし、私のゲームでの効果(トランジション、スクリーン、オーディオフェードインとフェードアウト)を扱う私のアイデアは、チェックされたキューにメッセージを追加するアクション(メニューで「Play」をクリックするか、キャラクターが特定のタイルを歩く)各ゲームのティック。これらのエフェクトはスレッドから発火して処理され、ゲームループは継続して実行されます。私は現在、私のpaintComponent()のGraphicsオブジェクトをMyEffectクラスにルーティングしていません。これは、私がエフェクトスレッドでgetGraphicsを使う理由です。 – WhitJackman
あなたのコードに基づいて、あなたは 'paintComponent'をオーバーライドしていませんが、' getGraphics'を使用しています。これは推奨されません。 Swingで定義されたペイントサイクルのコンテキスト作成していない 'Graphics'コンテキストも決して処理しないでください。私は 'BufferedImage'のポイントも見ません。また、アニメーションがSwingでどのように動作するかについてのコンセプトはないようです。 – MadProgrammer