人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

WAVEの再生

音を鳴らしてみます。ただ鳴らすだけではつまらないのでボールが跳ねるプログラムを改造し、ボールが壁に当たったら「ポン」と鳴るようにしてみます。ちなみに効果音はwav形式のファイルを使います。

効果音はザ・マッチメイカァズさんからお借りしました。

sound.jar

サウンド

ポイントは

    // サウンド
    private AudioClip pong;

    // サウンドをロード
    pong = Applet.newAudioClip(getClass().getResource("pong.wav"));

です。pong.wavというファイルをクラスファイルと同じ場所に用意しておいてください。サウンドファイルのロードはnewAudioClip ()を使います。こう使うものだと覚えてください。サウンドをロードしたら後は好きなところでplay()を呼び出して鳴らすだけです。

    // 効果音を鳴らす
    pong.play();

実はサウンドをロードする関数としてAppletクラスのgetAudioClip()というのもあります。こっちのメソッドの方があちこちでよく使われているようです。しかし、このメソッドはアプレット内でしか使えないという欠点があります。今回はアプリケーションを作っているためnewAudioClip()メソッドを使いました。このメソッドはAppletクラスのstaticメソッドであるためアプレット、アプリケーションのどちらでも使えます

SoundBall

前回移動するボールを表すBallクラスを作りました。今回はBallクラスを拡張してSoundBallクラス(跳ね返るとき音がなるボール)を作ってみます。すでにあるクラスの機能を下地にして新しいクラスを作ることを継承と言います。オブジェクト指向の重要な考え方です。

public class SoundBall extends Ball {
    // サウンド
    private AudioClip pong;
    
    public SoundBall(int x, int y, int vx, int vy) 
        super(x, y, vx, vy);
        // サウンドをロード
        pong = Applet.newAudioClip(getClass().getResource("pong.wav"));
    }
    
    // move()をオーバーライド
    public void move() {
        // ボールを速度分だけ移動させる
        x += vx;
        y += vy;

        // 左または右に当たったらx方向速度の符号を反転させる
        if (x < 0 || x > MainPanel.WIDTH - SIZE) {
            // 壁に当たったら音を鳴らす
            pong.play();
            vx = -vx;
        }

        // 上または下に当たったらy方向速度の符号を反転させる
        if (y < 0 || y > MainPanel.HEIGHT - SIZE) {
            // 壁に当たったら音を鳴らす
            pong.play();
            vy = -vy;
        }
    }
}

Ballクラスを継承しているためボールの位置を表すx,yや速度を表すvx,vyはすでに持っています。super()を使うとスーパークラス(Ball)のコンストラクタを呼び出せ、Ballクラスのインスタンス変数を初期化できます。SoundBallではBallの持ってない機能(音を鳴らす機能)だけコンストラクタに追加しています。

move()はBallクラスにもありましたが、音を鳴らす機能を追加したいので再定義しています。継承されたクラスでメソッドを上書きすることをオーバーライドと呼びます。ここでは、壁に当たったとき効果音を再生する処理を追加しています。

実際にボールを作っているのが下のコードです。

    // 音が鳴るボール
    private SoundBall ball;
    
    // ボールを作成
    ball = new SoundBall(0, 0, 5, 4);

SoundBall()を呼び出して音が鳴るボールを作っています。