質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Android

    6394questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

BGMの再生方法と条件で止める方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,180

MikeDavis

score 12

現在、イライラ棒ゲームをAndroidで作成しているのですが、壁に当たったりゲームクリアした際にBGMをとめる処理を書いたのですが、BGMをとめるどころか、BGMが鳴りません。どこが間違っているのでしょうか?
import java.util.ArrayList;
import java.util.LinkedList;

import jp.example.game2.Barricade.eType;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;

@SuppressLint("WrongCall")
public class GmaMgr {
    private MediaPlayer mp1;

@SuppressWarnings("unused")
private void MediaPlayer(MediaPlayer mp1){
mp1=MediaPlayer.create(getContext(),R.drawable.kusai);
mp1.start();
}   
    private enum eStatus{
        NORMAL,
        GAMEOVER,
        GAMECLEAR
    };    

    private static final float PI = (float) Math.PI;
    private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();
    private LinkedList<Task> _taskList = new LinkedList<Task>();
    private eStatus _status=eStatus.NORMAL;
    private Player _player;
    GmaMgr(){    
        _barrList.add(new BarricadeSquare(  0,  0,1200, 20, null));
        _barrList.add(new BarricadeSquare(  0,  0, 20,1800, null));
        _barrList.add(new BarricadeSquare(1180,  0, 20,1800, null));
        _barrList.add(new BarricadeSquare(  0,1800,1200, 20, null));
       
        _barrList.add(new BarricadeSquare(550,0,40,1740,null));
        
        //Left
        _barrList.add(new BarricadeSquare(70, 440, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 535, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 630, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 725, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 820, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 915, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 1010, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 1105, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 1200, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 1295, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 1390, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 1485, 500, 40, null));
        _barrList.add(new BarricadeSquare(70, 1580, 480, 40, null));
        _barrList.add(new BarricadeSquare(0, 1675, 500, 40, null));
        
        //Right
        _barrList.add(new BarricadeSquare(590, 50, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 145, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 240, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 335, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 430, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 525, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 620, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 715, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 810, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 905, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 1000, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 1095, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 1190, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 1285, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 1380, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 1475, 530, 40, null));
        _barrList.add(new BarricadeSquare(590, 1570, 540, 40, null));
        _barrList.add(new BarricadeSquare(650, 1665, 530, 40, null));


        //_barrList.add(new BarricadeSquare(0, 900, 1200, 20, new BConf(+PI/180)));
        //_barrList.add(new BarricadeSquare(0, 900, 1200, 20, new BConf(-PI/180)));
        //_barrList.add(new BarricadeTriangle(900,1200,200,new BConf(+PI/180)));
        
        _barrList.add(new BarricadeSquare(800,20,380,30,new BConf(eType.GOAL)));
                for (Barricade bar : _barrList) {
                        _taskList.add(bar);     
                }
                _player=new Player();
                _taskList.add(_player);

    }
     private Context getContext() {
        // TODO 自動生成されたメソッド・スタブ
        return null;
    }


    private boolean Collision(){
         Vec vec = new Vec();
         final Circle cir = _player.getPt();
         for(Barricade barr : _barrList){
                 Def.eHitCode code = barr.isHit(cir, vec);
                 switch(code){
                 case OUT:
                         _status = eStatus.GAMEOVER;
                         return true;
                 case GOAL:
                     _status=eStatus.GAMECLEAR;
                     return true;
                case NO:
                    break;
                default:
                    break;
                 }
         }
         return false;
 }

    public boolean onUpdate(){
        if( _status != eStatus.NORMAL ){
            return true;
    }
    if( Collision() ){
            return true;
    }
        for(int i=0; i<_taskList.size(); i++){
            if(_taskList.get(i).onUpdate()==false){
                _taskList.remove(i);
                i--;
            }
        }
        return true;
    }            
     public void drawStatus(Canvas c){    
        switch( _status ){
         case GAMEOVER:
         {
                 mp1.pause();
                 Paint paint = new Paint();
                 paint.setTextSize(80);
                 paint.setColor(Color.BLACK);
                 c.drawText("GameOver", 40, 100, paint);
                 break;
         }
         case GAMECLEAR:
         {
             mp1.pause();
             Paint paint=new Paint();
             paint.setTextSize(80);
             paint.setColor(Color.BLACK);
             c.drawText("GameClear",40,100, paint);
         }
         break;
        case NORMAL:
            break;
        default:
            break;
         }
 }
    
    public void onDraw(Canvas c){
        c.drawColor(Color.WHITE);
        for(Task task:_taskList){
            task.onDraw(c);
        }
        drawStatus(c);
    }
}


コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

音声素材の読み込みが下記になっているのが気になります。
R.drawable.kusai
音声素材をres/rawに配置してみるといかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/19 14:30

    そこに配置してみたのですが、変わりません

    キャンセル

checkベストアンサー

0

気になる点を以下に列挙します。こちらの勘違いがありましたらすみません。
・見た感じだとViewクラスの挙動に見えるが、Viewクラスを継承していない
@SuppressWarnings("unused")
private void MediaPlayer(MediaPlayer mp1){
mp1=MediaPlayer.create(getContext(),R.drawable.kusai);
mp1.start();
}
・音楽をセットするprivateメソッドのMediaPlayerをどこでも実行していない
getContext()メソッドをこのクラスでオーバーライドしており、nullを返している

追記
URLを教えていただきありがとうございます。
ゲーム状態を司っているクラスというわけですね。
でしたら、これを呼び出すSurfaceView系クラスのコンストラクタで
contextを引数に渡してGmaMgrコンストラクタを起動するのはどうでしょう?
(このページを元に改変します)
class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
        private GameMgr _gameMgr;  //ここではフィールド宣言だけしておく
        private Thread _thread;

        public GameSurfaceView(Context context) {
                super(context);
                getHolder().addCallback(this);
                _gameMgr = new GmaMgr(context);    //Context情報を渡してコンストラクタ起動
        }
        //以下略
}
GmaMgr側では、コンストラクタをContext型の引数を受け取るように変更し、
コンストラクタ内でmp1に音楽をセットし、再生する命令を記述するといいと思います。
ただし、MediaPlayer.createメソッドの第一引数はgetContext()ではなく、
コンストラクタ起動時に渡したContext型引数にするのを忘れずに。

それと、前の方も指摘してますが、第二引数がR.drawable.*なのがおかしい気がします。
drawableは画像を入れるディレクトリを指しているので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/19 10:59

    回答ありがとうございます。
    これらの点を解決するには、どのようなコードを記述すればよろしいのでしょうか?

    キャンセル

  • 2015/02/19 11:10

    一つ確認させてください
    このコードで問題なのは「音が出ない」の1点ですか?
    コード内容からして画面描画(+BGM再生)のクラスだと推測しているのですが、
    描画がきちんとされるのであれば、どのようにしてこのクラスを使っているのでしょうか?

    キャンセル

  • 2015/02/19 12:42

    音が出ない以外の問題はありません。
    構成は、http://dixq.net/Android/s02_02.html
    このサイトを参考にして作りました。

    キャンセル

  • 2015/02/19 18:45

    できました!
    ありがとうございました!
    下の方も、ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    AndroidViewPager

    現在FragmentTabHostの中にViewPagerを作っているのですが、タブを切り替えて戻ってくるとViewPagerの画面が表示されません。 空白の画面を何回かフリックす

  • 解決済

    手前から奥に表示するListView

    Androidにて,ぴったり重なったトランプの山のように,Viewを表示したいです. ListViewのdividerHeightを調整して重ねると,大量のViewが生成され,10

  • 受付中

    取得した画像をgridViewで表示する際に、スレッドを使って高速化したい

    端末内に保存されている画像を取得して、gridViewを使ってサムネイル表示するコードを書きましたが、画像が多くなると、取得に時間がかかり、表示までかなり待たされる状態です。 ス

  • 解決済

    Androidスマートフォンの現在地データをサーバーに送信する方法

    以前こちら https://teratail.com/questions/26472 で質問させていただいて、回答に取得した現在位置をサーバーに送信する。とありました。 そこ

  • 解決済

    初めての人のためのRecyclerView実装サンプルコード探しています

    AndroidStudio2.3.1で、縦方向のリスト形式で画像(アイコン)とテキストが、表示されるようなアプリを 作ろうと考えていますが、実際に作る前にRecyclerView

  • 解決済

    androidstudio 色検出

    androidstudioで色検出をしようとしています。このサイトのコードをほぼほぼコピペしたのですが FdActivity.javaでonCreateOptionsMenuの中の

  • 解決済

    android opencv で色検出

    私はandroidstudioでアプリ開発を行なっており今opencvを使っています。 フレームの中に入っている緑の色をしている領域の中で一番面積が大きいものを選び出し、その輪郭を

  • 解決済

    android opencvで輪郭描画

    私はandroidstudioでアプリ開発を行っています。 実現したいこと opencvで赤い色を検知して赤色を白に、それ以外を黒にしてそのあとに赤い物の輪郭の中心座標を返した

同じタグがついた質問を見る

  • Android

    6394questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。