2012-06-02 13 views
0

我已经创建了一个主活动启动的应用程序。在主Activity上,有2个复选框(cbPlayMusic和cbPlaySound)。当您通过单击开始按钮,使用此代码开始游戏:Android的布尔值不是做正确的事情 - 不断的MediaPlayer播放时它不应该被打

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是真实的,背景音乐启动时GobbleFishGame活性是由于playMusic()创建播放:

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(); 


      } 


     } 
    } 

所以这是我的问题。用拨动的声音出现同样的问题:如果我切换声音关闭,它的工作原理并没有什么声音了(声音在我的鱼吃另一鱼或游戏结束的声音等),但是当我再次切换的声音,这是行不通的:播放时不播放声音。

我的猜测是,它有事情做与布尔值。我不知道我的代码有什么问题,但我做错了什么?

在此先感谢。

+0

是内部分配'如果(isStopping =真)...'在方法'onOptionsMenuClosed'预期操作? – Howard

+0

是的,这是因为如果您选择的选择主菜单,你回去MainActivity,然后音乐停止播放。如果我不使用isStopping,则比mGraphView.continueGame();将被调用,其中音乐将继续。 – Fluppe

+0

我的意思是:你的意思是'=='而不是'='?否则if条件总是被满足,else路径是不需要的。 – Howard

回答

1

里面的MENU_MUSICMENU_SOUND处理你有下面的代码行:

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

既然你省略else每当第一if条件为真也是第二个被触发(由于分配mPlayMusic=true;内第一个),因此音乐开始后立即停止。

+0

你是对的!我无法相信这一直是我的错误,但是我并不真正知道如何修复代码,以便在您点击切换音乐时能如何工作:如果mPlayMusic为false,则mPlayMusic必须变为true并且音乐应该开始播放,并且如果mPlayMusic是真的,则mPlayMusic必须变成假,并且音乐应该停止播放。 – Fluppe

+0

@ user1417942那么,为什么你不能把'else'放在中间呢? – Howard

+0

是的,刚刚编辑我最后的评论,说一个简单的别的方法可以解决这个问题。我猜这一刻我并没有真正想过。 – Fluppe

相关问题