0

我创建了一个以主 Activity 开头的应用程序。在该主 Activity 上,有 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 Activity,这是 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 Activity 时开始播放背景音乐:

 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;
}

但是,切换音乐和切换声音选项将不起作用。这就是发生的情况:当复选框音乐为真时(所以音乐正在播放),如果你然后切换音乐它工作正常。但是,如果您想重新打开音乐,它也可以工作,但是暂停不再起作用。在暂停时,我调用 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_MUSICMENU_SOUND处理中,您有以下代码行:

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

由于您忽略了else只要第一个if条件为真,第二个条件也会被触发(由于第一个条件mPlayMusic=true;内的分配),因此音乐在开始后立即停止。

于 2012-06-02T12:31:58.297 回答