Hintergrundmusik
-
Heho
Ich habe Hintergrundmusik am laufen, bzw. sie schaltet sich ein, sobald der User n Kästchen anklickt und sollte sich ausschalten, sobald der Benutzer wieder auf das Kästchen klickt, also den Haken entfernt.
private: System::Void checkBox1_Click(System::Object^ sender, System::EventArgs^ e) { ISoundEngine* soundEngine = createIrrKlangDevice(); if(checkBox1->Checked::get()) { spieleHintergrundMusik(soundEngine); TestBox->Text = "Musik an"; } if(!checkBox1->Checked::get()) { stoppeHintergrundMusik(soundEngine); TestBox->Text = "Musik aus"; } }
die beiden Funktion spiele- und stoppeHintergrundMusik sehen wiefolgt aus:
void spieleHintergrundMusik(ISoundEngine* soundEngine) { if(!soundEngine) { return; } string sSoundFile = "La Musica Notturna (Passa Calle).mp3"; if(!soundEngine->isCurrentlyPlaying(sSoundFile.c_str())) { soundEngine->play2D(sSoundFile.c_str(), true); } } void stoppeHintergrundMusik(ISoundEngine* soundEngine) { soundEngine->drop(); }
allerdings beendet das Programm nicht die Musik, sobald ich den Haken des Kästchens entferne - weiß jemand warum?
-
was mir zuerst auffällt, warum checkst du in "stoppeHintergrundMusik()" nicht ob du einen NULL-pointer erhalten hast?
sticht mir zumindest als erstes ins auge.
und wäre es nicht klüger den blockif(!checkBox1->Checked::get()) { stoppeHintergrundMusik(soundEngine); TestBox->Text = "Musik aus"; }
als else if zu schreiben? letztendlich kann eh nur eins von beiden zutreffen.
ansonsten, bist du mal durchgesteppt? kommt deine programm überhaupt in die "stoppeHintergrundMusik()"-funktion?
versuchs ansonsten mal mit StopAllSounds
-
Ob if if oder else if ist für meine Frage ziemlich irrelevant, da es nur um schöneres coden geht - aber ich habs trotzdem geändert
void stoppeHintergrundMusik(ISoundEngine* soundEngine) { if(!soundEngine) { return; } else { soundEngine->drop(); } }
Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:
void spieleHintergrundMusik(ISoundEngine* soundEngine) { if(!soundEngine) { return; } string sSoundFile = "La Musica Notturna (Passa Calle).mp3"; if(!soundEngine->isCurrentlyPlaying(sSoundFile.c_str())) { // hier Fehler vermutet soundEngine->play2D(sSoundFile.c_str(), true); // oder hier :P } }
Ich probier selber nochmal aus, falls das aber jemandem ins Auge sticht, wo da der Fehler ist, darf er sich gerne melden^^
-
Ich arbeite auch mit Irrklang, und ich muss sagen, mach einfach eine globale Zeigervariable. ala
Header:
#ifndef SOUNDENGINE_HXX_INCLUDED #define SOUNDENGINE_HXX_INCLUDED #include "irrKlang.h" namespace Sound { extern irrklang::ISoundEngine* soundEngine; extern irrklang::ISoundSource *NoWinnerSound;//Beispielsound aus meinem Projekt //FUNKTIONEN ZUM ARBEITEN //... } namespace UnUsed { struct StartEnd { StartEnd(); ~StartEnd() { Sound::soundEngine->drop(); } } extern S; } #endif // SOUNDENGINE_HXX_INCLUDED
Source:
#include "SoundEngine.hxx" UnUsed::StartEnd S; irrklang::ISoundEngine* Sound::soundEngine(nullptr); irrklang::ISoundSource* Sound::NoWinnerSound(nullptr); UnUsed::StartEnd::StartEnd() { Sound::soundEngine = irrklang::createIrrKlangDevice(); Sound::NoWinnerSound = soundEngine->addSoundSourceFromFile("NoWinnerSound.ogg", irrklang::ESM_AUTO_DETECT, true); }
So mach ich es immer.
-
Zel2491 schrieb:
Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:
Also wenn die Funktion stoppeHintergrundMusik() gar nicht erreicht wird, liegts ja vielleicht eher an
if(!checkBox1->Checked::get()) {...}
Was gibt get() an der Stelle zurück?
-
Zel2491 schrieb:
Ob if if oder else if ist für meine Frage ziemlich irrelevant, da es nur um schöneres coden geht - aber ich habs trotzdem geändert
void stoppeHintergrundMusik(ISoundEngine* soundEngine) { if(!soundEngine) { return; } else { soundEngine->drop(); } }
ich meinte auch eher
private: System::Void checkBox1_Click(System::Object^ sender, System::EventArgs^ e) { ISoundEngine* soundEngine = createIrrKlangDevice(); if(checkBox1->Checked::get()) { spieleHintergrundMusik(soundEngine); TestBox->Text = "Musik an"; } else { stoppeHintergrundMusik(soundEngine); TestBox->Text = "Musik aus"; } }
denn wenn nicht checked ist, gibt es ja nur noch eine möglichkeit.
könnte dein problem vll auch beheben.
-
iop schrieb:
Zel2491 schrieb:
Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:
Also wenn die Funktion stoppeHintergrundMusik() gar nicht erreicht wird, liegts ja vielleicht eher an
if(!checkBox1->Checked::get()) {...}
Was gibt get() an der Stelle zurück?
Dafür hab ich da ja n kleinen "Debugger" eingefügt^^
private: System::Void checkBox1_Click(System::Object^ sender, System::EventArgs^ e) { ISoundEngine* soundEngine = createIrrKlangDevice(); if(checkBox1->Checked::get()) { spieleHintergrundMusik(soundEngine); TestBox->Text = "Musik an"; } else { soundEngine->stopAllSounds(); TestBox->Text = "Musik aus"; } }
Hab ne Textbox, deren Inhalt verändert wird, wenn ich draufklicke - und der Text wechselt auch immer schön brav zwischen "musik an" und "musik aus", also in den else-block kommt er schon rein
@anti-freak:
hab ich vllt schlecht gekennzeichnet, ich wusste schon, welchen Bereich du meintest, hab diesen auch geändert, das was ich dann gepostet hatte sollte eigentlich nur kurz zeigen, dass ich jetzt n Nullpointer abfange^^
Ich probier mal Sone's Vorschlag - bei Erfolg oder Misserfolg meld ich mich wieder
Danke für die ganzen Anregungen schonmal^^Naja...globale Zeigervariable funzt auch net...