本連載「PlayNでクロスプラットフォームのゲーム開発」では、Javaで書いたアプリをiOS、Android、HTML5、Flashなどにクロスコンパイルできるライブラリの概要や基本的な使い方を解説していきます。第3回は、PlayNでオーディオを再生する「Sound」インターフェイスや、データを保存する「Storage」インターフェイスについて解説します
グーグルが開発しているクロスプラットフォームゲームライブラリである「PlayN」を紹介している本連載。第2回目の前回「PlayNアプリでグラフィックや入力情報を使うには」では、PlayNを使用してさまざまな文字や図形、画像を表示しそれらを画面上で移動させたり拡大・縮小させたりする方法や、マウスやキーボードから入力されたインプット情報の取得方法を紹介しました。
第3回目である今回は、PlayNでのオーディオ再生、データ保存を紹介します。
前回の記事でPlayNのさまざまなサブシステムにアクセスする際に用いる「PlayN」クラスを紹介しました。画像を表示する際にはPlayNクラスの「assets」メソッドでリソースにアクセスするインターフェイスを取得し、「assets().getImage("fileName")」で画像ファイルを取得しました。
このAssetsインターフェイスは画像以外のリソースも取得でき、以下のようにすることでオーディオファイルを取得できます。
Sound sound = assets().getSound("fileName");
このgetSoundメソッドの返り値は「Sound」というPlayNのゲーム上でオーディオを再生するインターフェイスです。画像を取得するための「assets().getImage("fileName")」メソッドでは引数に「myImage.png」のように拡張子も含めて渡していました。この「assets().getSound("fileName")」メソッドでは「myAudio」と渡すだけで「myAudio.mp3」というMP3ファイルを取得するようです。
例えば、上記のようにgetSoundメソッドの返り値を「sound」変数に持たせた場合、以下のようにすることでオーディオファイルを再生・停止できます。
sound.play(); sound.stop();
また、そのほかにもSoundインターフェイスには以下のメソッドがあります。
boolean isPlaying() //【1】 float volume() //【2】 void setVolume(float volume) //【3】 void setLooping(boolean looping) //【4】 void addCallback(ResourceCallback<? super Sound> callback) //【5】
【1】は現在再生中かどうか、【2】は現在設定されているボリュームを0.0から1.0の間のfloat値で返します。【3】は引数で渡した値(こちらも0.0〜1.0のfloat値)にボリュームを設定し、【4】はループ再生の設定を行います。【5】はSoundインターフェイスのオブジェクトにコールバック・メソッドを持たせることで、オーディオファイルのロードが完了したタイミングで再生などの処理を行うように設定できます。
下記はキーボードの入力によってオーディオファイルを再生や停止、ボリューム設定などができるサンプルプログラムです。
package com.playn.sample.core; import static playn.core.PlayN.*; import playn.core.Game; public class SampleSound implements Game { @Override public void init() { SoundPlayer soundPlayer = new SoundPlayer("audio/audioFile"); keyboard().setListener(new KeyboardListener(soundPlayer)); } @Override public void paint(float alpha) { } @Override public void update(float delta) { } @Override public int updateRate() { return 25; } }
PlayNのGameインターフェイスを実装したSampleSoundクラスではinitメソッド内でSoundPlayerクラスのインスタンスを生成しキーボードリスナに渡しています。下記がSoundPlayerクラスであり、PlayNのSoundインターフェイスを使用してコンストラクタで渡されたオーディオリソースへアクセスし、再生や停止などを行えます。
package com.playn.sample.core; import playn.core.PlayN; import playn.core.Sound; public class SoundPlayer { private Sound sound; boolean loop = false; public SoundPlayer(String soundResource) { this.sound = PlayN.assets().getSound(soundResource); } public void play() { sound.play(); } public void stop() { sound.stop(); } public void switchLoop() { if (loop) { loop = false; } else { loop = true; } sound.setLooping(loop); } public void setVolume(float volume) { sound.setVolume(volume); } }
playメソッドでオーディオの再生、stopメソッドで停止を行います。また、ループ設定を切り替えるメソッドとしてswitchLoopメソッドでは、ループ設定がオンであればオフに、オフであればオンになるように設定します。setVolumeメソッドでは、引数として渡された値にボリュームを設定します。
キーボードのインプットによって、このSoundPlayerの各メソッドを呼ぶようにします。
package com.playn.sample.core; import playn.core.Key; import playn.core.Keyboard; import playn.core.Keyboard.Event; import playn.core.Keyboard.TypedEvent; public class KeyboardListener implements Keyboard.Listener { private SoundPlayer soundPlayer; public KeyboardListener(SoundPlayer soundPlayer) { this.soundPlayer = soundPlayer; } @Override public void onKeyDown(Event event) { // 【1】 if (event.key() == Key.P) { soundPlayer.play(); // 【2】 } else if (event.key() == Key.S) { soundPlayer.stop(); // 【3】 } else if (event.key() == Key.L) { soundPlayer.switchLoop(); // 【4】 } } @Override public void onKeyTyped(TypedEvent event) { try { Float number = Float.parseFloat(String.valueOf(event.typedChar())); soundPlayer.setVolume(number / 10); // 【5】 } catch (NumberFormatException e) { } } @Override public void onKeyUp(Event event) { } }
このKyeboardListenerクラスはPlayNのKeyboard.Listenerインターフェイスを実装しているため、onKeyDownやonKeyTyped、onKeyUpのメソッドによりキーボードからの入力情報を取得できます。キーボードリスナについては第2回目の記事でも紹介しましたので、詳しくは、そちらを参照してください。
このサンプルでは【1】のonKeyDownメソッドで入力されたキーを取得し、[P]であればオーディオファイルの再生(【2】)、[S]であれば停止(【3】)、[L]であればループ設定の切り替えを行っています(【4】)。
また、onKeyTypedメソッドにより[0]〜[9]のキーが押された場合は、SoundPlayerクラスのsetVolumeメソッドを使用して、入力された数値に合わせて音量設定を行っています(【5】)。
onKeyDownメソッドでも数値のキーが入力されたことは判別できますが、このメソッドの引数として渡されるEventクラスのオブジェクトの場合、event.key().toString()とすると数値自体ではなく「K1」「K2」「K3」などの「Key」という列挙型の値を返します。
一方、onKeyTypedメソッドの引数として渡されるTypedEventクラスのオブジェクトでは、event.typedChar()とすることで「1」「2」などの数値を文字として取得できます。そのため、ここではevent.typedChar()で返される値を使用してfloatの数値を取得しており、数値以外の値の場合はNumberFormatExceptionによりボリューム設定の処理は行われません。
また、SoundインターフェイスのsetVolumeメソッドで設定する音量の値は0.0〜1.0のため、floatに変換した値を10で割ったものを引数として渡しています。
Copyright © ITmedia, Inc. All Rights Reserved.