Viewで音を再生する

1.開発目標

このページの目標は、BGMと効果音を鳴らすことです。画像の表示と似た方法で実現できます。

2.BGMと効果音を用意する

BGMや効果音を用意します。oggやmp3などが使えますが、どうもoggが良いようです。ネット上には、すばらしいフリー素材サイトがあります。この開発では、「魔王魂」からゲットすることにします。

BGM「戦闘曲-戦闘曲02」と、効果音「物音-パソコン01」をダウンロードしました。

これらを、resの中のrawフォルダに入れます。おそらくrawフォルダは無いので新しく作ります。

フォルダ構成

[ UsingView ]
    [ src ]
    [ gen ]
    [ Android 1.6 ]
    [ assets ]
    [ res ]
        [ drawable-hdpi ]
        [ drawable-ldpi ]
        [ drawable-mdpi ]
        [ layout ]
        [ raw ]
            battle02.ogg
            pc01.ogg
        [ values ]
    AndroidManifest.xml
    default.properties
    proguard.cfg

3.BGMと効果音を読み込む

BGMと効果音を鳴らすために、まずプログラムにこれらを読み込みます。基本は画像と同じです。

SampleView.java

package sample.android.usingview;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.view.MotionEvent;
import android.view.View;

class SampleView extends View {
    Paint paint = new Paint();oburin);
    int playerX = 250;
    int playerVX = 10;
    int playerY = 150;
    int playerVY = 0;
    
    //画像読み込み
    Resources res = this.getContext().getResources();
    Bitmap grass = BitmapFactory.decodeResource(res, R.drawable.grass);
    Bitmap goburin = BitmapFactory.decodeResource(res, R.drawable.goburin);
    
    //音楽読み込み
    MediaPlayer bgm = MediaPlayer.create(getContext(), R.raw.battle02);
    MediaPlayer se = MediaPlayer.create(getContext(), R.raw.pc01);
    
    public SampleView(Context context) {
        super(context);
    }
    
    @Override
    public void onDraw(Canvas c) {
        …略…
    }
    
    public boolean onTouchEvent(MotionEvent me) {
        …略…
    }
}

4.BGMと効果音を鳴らす

BGMと効果音を鳴らします。これは、bgm.start()やse.start()で簡単にできます。効果音はこれでOKです。でも、問題はBGMです。Androidアプリの音楽は、アプリが終了しても自動では止まってくれません。ので、止める処理をちゃんと書いておかないと面倒なことになります。この開発では、アプリ終了時にActivityのonDestroyメソッドが実行されることを利用します。ViewにstopSoundと言う自作メソッドを作って、これをActivityのonDestroyメソッドから実行します。

SampleView.java

package sample.android.usingview;

import android.content.Context;
…略…

class SampleView extends View {
    Paint paint = new Paint();oburin);
    int playerX = 250;
    int playerVX = 10;
    int playerY = 150;
    int playerVY = 0;
    
    //画像読み込み
    Resources res = this.getContext().getResources();
    Bitmap grass = BitmapFactory.decodeResource(res, R.drawable.grass);
    Bitmap goburin = BitmapFactory.decodeResource(res, R.drawable.goburin);
    
    //音楽読み込み
    MediaPlayer bgm = MediaPlayer.create(getContext(), R.raw.battle02);
    MediaPlayer se = MediaPlayer.create(getContext(), R.raw.pc01);
    
    public SampleView(Context context) {
        super(context);
        bgm.setLooping(true);
        bgm.start();
    }
    
    @Override
    public void onDraw(Canvas c) {
        …略…
    }
    
    public boolean onTouchEvent(MotionEvent me) {
        //タッチされた時
        if(me.getAction() == MotionEvent.ACTION_DOWN) {
            playerVY = -20;
            se.start();
        }
        
        return true;
    }

    //音楽を停止する
    public void stopSound() {
        bgm.stop();
    }
}

SampleActivity.java

package sample.android.usingview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class SampleActivity extends Activity {
    SampleView sv;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Viewをセットする
        LinearLayout l = new LinearLayout(this);
        setContentView(l);
        sv = new SampleView(this);
        l.addView(sv);
    }
    
    @Override 
    public void onDestroy(){ 
        super.onDestroy();
        //音楽を停止する
        sv.stopSound();
    }
}

5.開発結果

これでアプリがスタートするとBGMが流れ、タッチすると効果音が鳴るはずです。実行してみます。

静止画ではまったく分からないですが、BGMが鳴りました。画面をタッチするとゴブリンがジャンプすると同時に、カチャと効果音が鳴ります。これだけできればアイデアしだいで面白いゲームが作れそうです。これでゲーム開発のためのViewの使い方を終わります。