Android携帯ゲームを作って世界に配信してみよう(3) ―― 効果音の入れ方とデータの保存処理を学ぶ
●ゲーム内でのSoundPoolの利用方法
ゲーム内では,次のようにSoundPoolを利用して効果音を再生します.まず,アプリケーション(DribbleActivity)が起動し,画面(SurfaceView)が生成されたタイミングで,SoundPoolの初期化を行います.管理クラスの生成と,利用するすべての効果音を読み込みます.その後,ゲームの場面の中で,必要な効果音を再生しています.
リスト4は,ゲームの起動時に初期化処理を行っているところです.ゲーム内のすべての効果音を管理するSoundsクラスのinitメソッドを呼び出します.リソースの読み込みには,Contextが必要となりますので,引数にContextを渡しています.
/** * ゲームループスレッドを生成し ゲームループを開始 or 再開 */ public static void createThread(final SurfaceView view) { Main.view = view; if (first) { Sounds.init(view.getContext()); PlayLog.init(view.getContext()); Main.initScenes(view); startScene(Main.TITLE); first = false; } thread = new Thread() { @Override public void run() { Main.runLoop(); } }; thread.start(); } |
次に,リスト5のように,今回ゲーム内で同時に利用される三つの効果音を,一括で読み込みます.また,読み込んだ際にAPIが戻す音声ID(soundID)を保管して,再生時に利用できるようにします.
public static void init(final Context context) { Sounds.context = context; soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); sidBounce1 = soundPool.load(context, R.raw.sfx_bounce1, 1); sidBounce2 = soundPool.load(context, R.raw.sfx_bounce2, 1); sidTouch = soundPool.load(context, R.raw.sfx_touch, 1); } |
ボールがバウンドした際に効果音1を再生しています(リスト6,リスト7).指定しているパラメータの意味は,効果音の定位はセンター,プライオリティは最低,ループはしない,再生ピッチは標準となります.
public void process(SurfaceView view) { : if (floor <= ballY) { // 床に当たった : if (bounce < 1 && ballVY < 1) { // 床の上で停止している : } else { // 床の上でバウンド ballY = floor - bounce; ballVY = -ballVY * DECAY_VERTICAL; dribbled++; Sounds.playBounce1(); Log.v("Dribble","Bound on the floor: ballVY=" + ballVY + ",bounce=" + bounce); : } : } else { : } : } |
public static void playBounce1() { soundPool.play(sidBounce1, 1.0F, 1.0F, 0, 0, 1.0F); } |