フェードアウト効果
だんだん透明になって見えなくなる画面効果をフェードアウトと言います(逆にだんだん見えてくるのはフェードイン)。フェードアウトは半透明描画で解説したアルファ値をだんだん小さくすることで実現できます。
ちなみにレムオルはドラクエ3の姿を消す呪文です。
まずWizardクラスのremuoru()メソッドを見てください。レムオル!ボタンを押すとremuoru()が呼び出されます。
public void remuoru() { System.out.println("魔法使いはレムオルを唱えた!"); alpha = 1.0f; spellClip.play(); // alpha値を減らすタイマータスクを起動 TimerTask task = new FadeOutTask(); Timer timer = new Timer(); timer.scheduleAtFixedRate(task, 0, 100); }
アルファ値(alpha)を1.0fから減らすTimerTaskを起動しています。TimerTaskは指定したタスクを指定した間隔で実行する仕組みです。ここでは、FadeOutTaskを100ミリ秒間隔で実行するようにしています。FadeOutTaskはアルファ値を減らすタスクです。
private class FadeOutTask extends TimerTask { public void run() { alpha -= 0.05f; panel.repaint(); // 完全に消えたらタスク終了 if (alpha < 0) { cancel(); } } }
0.05ずつアルファ値を減らしてます。アルファ値が0に近づくほど透明度が増し、0になると完全に透明になります。
最後にWizardクラスの描画メソッドです。
public void draw(Graphics g) { Graphics2D g2d = (Graphics2D) g; // アルファ値は0.0-1.0 if (alpha < 0.0f) alpha = 0.0f; else if (alpha > 1.0f) alpha = 1.0f; // 現在のCompositeを保存 Composite comp = g2d.getComposite(); // アルファ値をセット g2d.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha)); g.drawImage(wizardImg, 70, 70, null); // 元のCompositeに戻す g2d.setComposite(comp); }
setComposite()でアルファ値をセットしてから描画しています。詳しくは半透明描画(2006/12/3)を参照してください。