0

メインのアクティビティで始まるアプリを作成しました。そのメインアクティビティには、2つのチェックボックス(cbPlayMusicとcbPlaySound)があります。スタートボタンをクリックしてゲームを開始すると、次のコードが表示されます。

btStart.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            Intent intent = new Intent(GobbleFishMainActivity.this, GobbleFishGame.class);
            intent.putExtra(INTENT_EXTRA_PLAY_MUSIC, cbMusic.isChecked());
            intent.putExtra(INTENT_EXTRA_PLAY_SOUND, cbSound.isChecked());


            startActivity(intent);
        }
    });

アクティビティに加えて、これは次のとおりです。

public static final String INTENT_EXTRA_PLAY_MUSIC = "be.fielibert.gobblefish.extra.PLAY_MUSIC";
public static final String INTENT_EXTRA_PLAY_SOUND = "be.fielibert.gobblefish.extra.PLAY_SOUND";

次に、[スタート]、[GobbleFishGameアクティビティ]の順にクリックすると、これがonCreateコードになります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    initBitmaps();
    mGraphView = new GraphView(this);
    mPlayMusic = getIntent().getBooleanExtra(GobbleFishMainActivity.INTENT_EXTRA_PLAY_MUSIC,true);
    mPlaySound = getIntent().getBooleanExtra(GobbleFishMainActivity.INTENT_EXTRA_PLAY_SOUND,true);

    setContentView(mGraphView);
    mGraphView.runProgram();
    playMusic();



}

mPlayMusicがtrueの場合、playMusic()が原因でGobbleFishGameアクティビティが作成されると、バックグラウンドミュージックの再生が開始されます。

 private void playMusic(){

    if (!mPlayMusic) {
        return;
    }
    mPlayer = MediaPlayer.create(GobbleFishGame.this, R.raw.song);
    mPlayer.setLooping(true);
    mPlayer.start();
}

これまではすべて正常に動作します。ただし、Androidデバイスのメニューボタンを押すと、メインメニュー、ゲームの再開、音楽の切り替え、サウンドの切り替えの4つのオプションでメニューが作成されます。メニューのコードは次のとおりです。

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(Menu.NONE, MENU_MENU, Menu.NONE, "Main menu");
    menu.add(Menu.NONE, MENU_RESTART,   Menu.NONE, "Restart game");
    menu.add(Menu.NONE, MENU_MUSIC,    Menu.NONE, "Toggle music");
    menu.add(Menu.NONE, MENU_SOUND,   Menu.NONE, "Toggle sound");
    return true;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    mGraphView.pauseGame();
    return super.onMenuOpened(featureId, menu);
}

@Override
public void onOptionsMenuClosed(Menu menu) {
    super.onOptionsMenuClosed(menu);
    if(isStopping=true){
        return;
    }
    else{
        mGraphView.continueGame();
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == MENU_MENU) {
        //mPlayer.release();
        isStopping=true;
        stopMusic();
        mGraphView.mState = STATE_STOP;
        Intent intent = new Intent(GobbleFishGame.this, GobbleFishMainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        //finish();
    }
    else if (item.getItemId() == MENU_RESTART) {
        mGraphView.init();
        mPlayer.reset();
        playMusic();
    }
    else if (item.getItemId() == MENU_MUSIC) {
        if (!mPlayMusic) {
            mPlayMusic=true;
            if (mPlayer != null) {
                //mPlayer.start();
                playMusic();
            }
            //playMusic();
        }
        if(mPlayMusic){
            mPlayMusic=false;
            stopMusic();
        }
    }
    else if (item.getItemId() == MENU_SOUND) {
        if (!mPlaySound) {
            mPlaySound=true;
            if (mp != null) {
                mp.reset();
            }
            //mp.reset();
        }
        if(mPlaySound){
            mPlaySound=false;
        }
    }

    return true;
}

ただし、[音楽の切り替え]と[サウンドの切り替え]のオプションは機能しません。これが起こります。チェックボックスの音楽がtrueの場合(つまり音楽が再生されている場合)、音楽を切り替えると正常に機能します。ただし、音楽をオンに戻したい場合は、それも機能しますが、一時停止は機能しなくなります。一時停止中にmPlayer.pauseを呼び出します。音楽のオンとオフを切り替えていない場合は、これで問題なく動作します。音楽のオンとオフを切り替えた場合、何らかの理由で一時停止が機能しなくなります。

これは一時停止コードです:

public void pauseGame() {
        if (mMode != MODE_PAUSE) {
            mMode = MODE_PAUSE;
            if (!mPlayMusic) {

                return;
            }
            if (mPlayer != null) {

                mPlayer.pause();


            }


        }
    }

それが私の問題です。トグルサウンドでも同じ問題が発生します。サウンドをオフに切り替えると機能し、音が出なくなります(魚が別の魚を食べたときやゲームオーバーの音のように聞こえます)が、サウンドを再度オンにすると機能しません:再生すべきときに音が出ない。

私の推測では、それはブール値と関係があると思います。コードの何が問題なのかわかりませんが、何が問題なのですか?

前もって感謝します。

4

1 に答える 1

1

MENU_MUSICと処理の中MENU_SOUNDには、次のコード行があります。

if (!mPlayMusic) {
    mPlayMusic=true;
    ... playMusic(); ...
}
if(mPlayMusic) {
    mPlayMusic=false;
    ... stopMusic(); ...
}

else最初の条件が真の場合は常に省略したためif、2番目の条件もトリガーされ(最初の条件mPlayMusic=true;内の割り当てのため)、開始後すぐに音楽が停止します。

于 2012-06-02T12:31:58.297 に答える