Section 3.11 サウンドの再生

前回で時計を動かせるようになったから、今回はアラームを鳴らしてみるね。
うん!
…あ、でもアラームってどうやって鳴らすの?
WaveSoundBuffer クラスを使うの。
WaveSoundBuffer クラス?
WaveSoundBuffer クラスは WAVE 形式のサウンドの再生を管理するクラスだよ。
それって拡張子が ".wav" になってるファイルのこと?
そうそう。
Config.tjs の中にある BGM 設定の type"Wave" にした時に再生できる形式のことね。
あ、そーいうことね。
それじゃ、説明の前にまずは実際にアラームを鳴らしてみよっか。
は〜い!

<アラームを鳴らすスクリプト(SoundWindow クラス)>

class SoundWindow extends Window
{
    var buffer;  // WaveSoundBuffer クラスのオブジェクト

    // コンストラクタ
    function SoundWindow()
    {
        super.Window();

        buffer = new WaveSoundBuffer(this);
        buffer.looping = true;     // ループ再生します
        buffer.open("alarm.wav");  // プロジェクトフォルダにある "alarm.wav" を開きます

        visible = true;
    }

    // デストラクタ
    function finalize()
    {
        super.finalize();
    }

    // action メソッド
    function action(ev)
    {
        // ウィンドウに対してキーが押されたかどうかをチェックします
        if(ev.target == this && ev.type == "onKeyDown")
        {
            if(ev.key == VK_P)
            {
                // P キーが押された場合は(現在停止中であれば)アラームを鳴らします
                if(buffer.status == "stop")
                    buffer.play();
            }
            else if(ev.key == VK_S)
            {
                // S キーが押された場合は(現在再生中であれば)アラームを止めます
                if(buffer.status == "play")
                    buffer.stop();
            }
        }
    }
}

var win = new SoundWindow();  // ウィンドウを作ります

スクリプトを実行する前に、アラーム用のファイルをプロジェクトフォルダに置いといてね。
zip 形式になってるから、解凍してから "alarm.wav" っていうファイルをプロジェクトフォルダに置いてね。
りょーかい!
んじゃ実行してみて。
うん。

<実行結果>

表示されたウィンドウ

ウィンドウが表示されたね。
でもアラームは鳴ってないよ?
起動しただけじゃ鳴らないようにしてるからね。
キーボードの P キーを押してみて。
うん。
……あ、アラームが鳴った!
じゃあ、今度は S キーを押してみて。
あ、アラームが止まったね。
ん、ちゃんと実行できたみたいだから、スクリプトの説明に移るね。
はーい。
いつも通り、最初はコンストラクタからね。
まず、WaveSoundBuffer クラスのコンストラクタは、引数を1つ取るんだ。
this になってるから、このウィンドウを引数に指定してるってことだよね?
うん。
この引数には、イベントが起こった時に action メソッドを呼び出すオブジェクトを指定するんだ。
じゃあ、イベントが起こったら SoundWindow クラスの action メソッドが呼び出されるってこと?
ん、そうだよ。
ちなみに今回は WaveSoundBuffer クラスのイベント処理はしないけどね。
あ、そうなんだ。
次は looping プロパティ。
これはループ再生するかどうかを設定するプロパティなんだ。
true になってるから、ループ再生するってことだよね。
そ。で、最後は open メソッド。
サウンドを再生する前に、このメソッドでファイルを開いとく必要があるんだ。
ファイルを開いたらすぐ再生、っていうわけじゃないんだね。
今回は "alarm.wav" っていうファイルだけを使うから、予めコンストラクタでファイルを開いてるんだ。
open メソッドの引数はファイル名だけなの?
うん、そだよ。
じゃあ、次は action メソッド ね。
onKeyDown って初めて見るイベントだね。
onKeyDown はキーが押された時に起きるイベントなんだ。
それって onMouseDown のキーボード版みたいなもの?
ん、そんな感じ。
だから onKeyUp っていうのもあるよ。
今回は targetthis になってるね。
今回はレイヤを使ってないから、ウィンドウに対して起こったイベントを処理してるんだ。
ってことは、ウィンドウにもレイヤと同じようなイベントが起きるの?
全く同じってわけじゃないけど、onClick, onMouseUp, onMouseDown, onMouseMove, onMouseEnter, onMouseLeave, onKeyUp, onKeyDown とかは Window クラスにも Layer クラスにもあるね。
結構共通してるイベントが多いねぇ。
確かにね。
でも Window クラスの onKeyDown メソッドと Layer クラスの onKeyDown メソッドは引数が違ってるんだ。
えっ、そうなの?
じゃ、とりあえず Window クラスの onKeyDown メソッドの引数の説明をするね。

Window クラスの onKeyDown メソッドの引数(Window クラスの onKeyUp メソッドも同じ引数を持ちます)>
引数名引数の意味値の種類
第1引数key押されたキーの仮想キーコードの値VK_ で始まる仮想キーコード
第2引数shift同時に押されていたシフト系のキー/マウスボタンの種類mbLeft(左ボタン), mbRight(右ボタン), mbMiddle(中ボタン), ssAlt(ALTキー), ssShift(SHIFTキー), ssCtrl(CTRLキー), ssRepeat(キーリピート)のビット OR による組み合わせ
第3引数processスーパークラスの onKeyDown を呼び出す時に、この引数を false にすると、スーパークラスでそのキーに対するデフォルトの処理を行わなくなりますtrue(デフォルト)/false

まず、第1引数は押されたキーの種類を表す仮想キーコードになるんだ。
仮想キーコード?
仮想キーコードっていうのは、それぞれのキーに割り当てられてる値のことだよ。
例えば、P キーには VK_P っていう値が割り当てられてるから、 P キーが押された場合は key の値は VK_P になってるんだ。
えっと、それってつまり、『key == VK_P』が真になってたら P キーが押されたってこと?
ん、そういうことだよ。
仮想キーコードは吉里吉里2リファレンスの付録の仮想キーコード一覧に載ってるから、ちょっと見てみて。
わ、仮想キーコードってすごいいっぱいあるんだね。
その中に VK_P っていうのと VK_S っていうのがあるでしょ。
うん、それぞれ 0x500x53 って書いてあるね。
これって16進数だよね?
そ。つまり、仮想キーコードってのは実際には数字なワケ。
VK_P は10進数では 80 だから、 『key == VK_P』 と 『key == 80』ってのは同じ結果になるわけだね。
へぇ、そうなんだ。
じゃ、次は第2引数だけど、これは§3.8onMouseMove メソッドの shift とほぼ同じだね。
今回はこれは使ってないから、詳しい説明はパスするね。
うん、わかった。
第3引数は、スーパークラスの onKeyDown メソッドを呼び出す時に、 押されたキーに対するデフォルトの処理をするかどうかを指定するための引数なんだけど、 ちょっと解りにくいと思うし、普通はデフォルトの true でいいから、これも説明はパスさせてもらうね。
ん〜、なんかよくわかんないけど、りょーかい。
ま、とりあえずこの引数は気にしなくていいよ。
ちなみに、この第3引数は Layer クラスの onKeyDown メソッドには無いんだ。
あ、それがさっき言ってた Window クラスと Layer クラスで引数が違ってるってこと?
そ。こんなふうに、同じ名前のメソッドでもクラスによって引数が違ったりすることがあるから、気をつけてね。
は〜い。
action メソッドの中では、P キーと S キーが押された時に、 それぞれ再生と停止の処理をしてるわけだけど、次はこの処理の説明をしていくね。
まずは P キーが押された時の処理から。
status っていうプロパティ…? を参照してるね。
status プロパティは現在の状態を取得できるプロパティで、この3つの状態のどれかになってるんだ。

status プロパティの値>
現在の状態
"unload"ファイルが開かれていない
"play"再生中
"stop"停止中

えっと、条件式は『buffer.status == "stop"』になってるから、 現在停止中なら play っていうメソッドを呼び出す、ってことかな?
ん、そういうこと。
ちなみに play はサウンドを再生するメソッドだよ。
じゃ、次は S キーが押された時の処理ね。
今度は条件式が『buffer.status == "play"』だから、 現在再生中だったら stop メソッドを呼び出すってことだよね。
そ。stop メソッドはサウンド再生を停止するメソッドね。
どう、action メソッドの処理は解った?
うん、おっけーだよ!
WaveSoundBuffer クラスの使い方も大体解ったし。
そっか。じゃあ、今回はこれで終わりかな。
あ、その前に1つ質問してもいい?
ん、いいよ。何?
KAG だと BGM とかに ogg ファイルをよく使うよね。
WaveSoundBuffer クラスって、ogg の再生もできるの?
うん、できるよ。
ただし、プラグインを使う必要があるけどね。
ogg 用のプラグインって、KAG だと loadplugin タグを使って読み込むよね。
[loadplugin module="wuvorbis.dll"] って感じに。
TJS だとプラグインを読み込むための Plugins クラス っていうクラスがあって、それを使うんだ。
どうやってプラグインを読み込むの?
link っていうメソッドを使って、こうやって読み込むの。

<プラグインの読み込み>

// SoundWindow クラスの定義は省略します

Plugins.link("wuvorbis.dll");  // ogg 再生用プラグインを読み込みます

var win = new SoundWindow();  // ウィンドウを作ります

こうすれば WaveSoundBuffer クラスの open メソッドに ogg ファイルを指定できるようになるよ。
簡単でしょ。
ほんとだ、KAG のタグと同じくらい簡単だね。
これでいいかな?
うん、おっけーだよ。
ん、じゃあ今回はここまでにしよっか。
それじゃ、また次回ね!


前へ | TOP | 次へ