Fehlerbehebung
Es ist wichtig, dass wir in unserer onCreate() Methode unserer GameActivity die Methode initialize() erst direkt vor der if(soundToggleState()) Abfrage aufrufen. Da sonst die Hintergrundmusik nicht aktiviert wird, wenn der Spieler auf den Soundtogglebutton klickt und den Sound damit aktiviert.
Dann müssen wir in unserer initialize() Methode in die if Abfrage, in der überprüft wird ob mpBackground nicht null ist und außerdem gerade abgespielt wird, noch folgenden Code hinzufügen:
mpBackground.release();
Sodass sie folgendermaßen aussieht:
private void initialize() {
resume = (Button) dialog.findViewById(R.id.bContinue);
menu = (Button) dialog.findViewById(R.id.bMainMenu);
newTry = (Button) dialog.findViewById(R.id.bNewTry);
resume.setOnClickListener(this);
menu.setOnClickListener(this);
newTry.setOnClickListener(this);
SharedPreferences pref = getSharedPreferences("GAME", 0);
vibrationToggleState = pref.getBoolean("vibrationToggleState", false);
vibrationToggle = (ToggleButton) dialog.findViewById(R.id.tbVibration);
vibrationToggle.setChecked(vibrationToggleState);
vibrationToggle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
saveVibrationToggleState();
}
});
soundToggleState = pref.getBoolean("soundToggleState", false);
soundToggle = (ToggleButton) dialog.findViewById(R.id.tbSound);
soundToggle.setChecked(soundToggleState);
soundToggle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
saveSoundToggleState();
if (soundToggle.isChecked()) {
createBackgroundSound();
if (mpBackground != null && !mpBackground.isPlaying()) {
try {
// mpBackground.prepare();
mpBackground.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
// catch (IOException e) {
// e.printStackTrace();
// }
}
} else {
if (mpBackground != null && mpBackground.isPlaying()) {
mpBackground.stop();
mpBackground.release();
}
}
}
});
}
Dazu benötigen wir außerdem noch die Methode createBackgroundSound die ich erzeugt habe, um einem Error vorzubeugen.
public void createBackgroundSound() {
mpBackground=null;
mpBackground = MediaPlayer.create(this, R.raw.backgroundlesatre);
mpBackground.setLooping(true);
}
In dieser Methode leere ich zuerst das Objekt mpBackground und erzeuge dann einen neuen Mediaplayer bei dem ich dann noch die Endlosschleife aktiviere(setlooping(true)).
Damit der Sound nun auch wieder ausgeschalten wird, wenn unsere Activity pausiert, oder zerstört wird, müssen wir unsere onPause und und onDestroy Methoden modifizieren.
@Override
protected void onPause() {
super.onPause();
theGameView.pauseThread();
firstStart = false;
if (mpBackground != null && mpBackground.isPlaying()) {
mpBackground.stop();
mpBackground.release();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
theGameView.pauseThread();
dialog.dismiss();
mpPoint.release();
mpMinusPoint.release();
}
Wenn das Spiel nun pausiert wurde, z.B. durch das klicken auf die Sleeptaste des Smartphones, und man ins Spiel zurückkehrt, wird die Hintergrundmusik nicht wieder gestartet. Um das zu ändern müssen wir unsere onResume() Methode auch noch überarbeiten, sodass sie folgendermaßen aussieht:
@Override
protected void onResume() {
super.onResume();
if (!firstStart) {
dialog.show();
dialogIsActive = true;
createBackgroundSound();
if (soundToggleState) {
mpBackground.start();
}
}
}
Wir erschaffen also einen neuen Mediaplayer und starten unsere Hintergrundmusik, wenn der Soundtogglebutton aktiv ist.