読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



フェードアウト効果

Javagame

だんだん透明になって見えなくなる画面効果をフェードアウトと言います(逆にだんだん見えてくるのはフェードイン)。フェードアウトは半透明描画で解説したアルファ値をだんだん小さくすることで実現できます。

remuoru.jar

ちなみにレムオルはドラクエ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)を参照してください。