PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ PlaySound in Consolen-Apllication ???



jookerxxx
26.04.2009, 15:37
Hallo ich hab mich lange nicht mehr gemeldet aber ich hab mal eine Frage wo ich einfach nicht mehr weiter komme.
Ich arbeite gerade an einem Projekt...So ein Dungeon_Game ....
Naja hab jedenfalls schon:
monster.h,monster.cpp,soldat.h,soldat.cpp,main.cpp .
Naja es gibt zwar noch so kleinere Probleme bei der Attack Funnktion,
aber das schaff ich auch alleine.
Wo ich jedoch am verzweifeln bin, ist der Sound.
Ich hab mich mal schlau gemacht.....
Es soll ja zwei möglichkeiten geben die für mich in Frage kommen...
1. #include <windows.h>
PlaySound(TEXT("music.wav"), NULL, SND_FILENAME);
2. #include <mmsystem>
sndPlaySound(""music.wav,NULL,SND_ASYNC)

Ich bin auch schon ganz nah drann das zu schaffen jedoch gibt der Compiler jedes mal den einen Error aus,auch wenn ich das in einer API-Application ausführe:

Compiler Error:
[Linker error] undefined reference to `PlaySoundA@12'
ld returned 1 exit status
C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\Makefile.win [Build Error] ["The] Error 1

Ich werde daraus einfach nicht schlau...und in meinem Buch:
C++ von A bis Z von Jürgen Wolf(sehr empfehlens wert)
steht im Kapitel der Objektorientierten Programmierung auch nichts drüber.
Danke schonmal für das Lesen des riesen Textes und im vorraus für alle Antworten(hoffe ich bekomme welche)

nestee
26.04.2009, 16:52
Weiß jetzt auch nicht recht allerdings währe es nicht schlecht wenn du mal deinen Compiler und Code ausschnitt posten würdest.Auserdem kannst du auch "mciSendString" nutzen wenn das dich weiter bringt.:o

jookerxxx
26.04.2009, 17:00
Also ich hab den Dev C++ Compiler und
Codeausschnitte...welche sollte ich denn da Posten?
Hab übrigends auch noch eine "common_header.h" Datei...
da hab ich halt alle Headers includiert die ich brauche

#include "common_header.h"
#include "monster.h"
#include "soldat.h"
using namespace std;

int main(){

int SoldatenWahl = 0;

Sleep(3000);
//PlaySound(TEXT("music.wav"), NULL, SND_FILENAME);
do{
system("CLS");
cout<<"\t\t -------------The Game-------------"<<endl<<endl;

cout<<"\t\t Wähle deinen Soldaten aus:"<<endl<<endl;

cout<<"\t\t 1. \t\tJohn"<<endl;
cout<<"\t\t 2. \t\tTommy"<<endl;
cout<<"\t\t 3. \t\tJason"<<endl;
cout<<"\t\t 4. \t\tJack"<<endl;
cout<<"\t\t 5. \t\tSpiel Ende"<<endl;
cin>>SoldatenWahl;
if(SoldatenWahl > 4 && SoldatenWahl != 5 || SoldatenWahl <= 0){
cout<<"Fehler bei der Eingabe...Bitte versuche es erneut...";
getch();
}

if(SoldatenWahl == 5){
exit (1);
}

switch(SoldatenWahl){
case 1:
Soldat John();
cout<<"Du hast John gewählt"<<endl;
break;
case 2:
Soldat Tommy();
cout<<"Du hast Tommy gewählt"<<endl;
break;
case 3:
Soldat Jason();
cout<<"Du hast Jason gewählt"<<endl;
break;
case 4:
Soldat Jack();
cout<<"Du hast Jack gewählt"<<endl;
break;
}//Ende von switch



getch();
}while(SoldatenWahl = 0);




return 0;
}

Das währe z.B meine main.cpp

blackberry
26.04.2009, 17:11
@nestee
Der Sourcecode ist absolut unerheblich, die Fehlermeldung sagt bereits alles.
Beim Compiler (bzw. IDE) hast du Recht, aber anhand der Fehlermeldung kann man die IDE als Dev-C++ und den Compiler als MinGW32 identifizieren.

@joker
Entschuldigung, dass ich erst jetzt etwas dazu sage, aber als ich es vorhin versucht habe war die Seite zu langsam um etwas abschicken zu können.


Library: Use Winmm.lib.

Bei Dev-C++:
Projekt -> Projekt Optionen -> Parameter -> Bibliothek Hinzufügen

Winmm.lib sollte sich in C:\Dev-Cpp\lib befinden.


mfG. BlackBerry

jookerxxx
26.04.2009, 18:34
@ BlackBerry du brauchst dich garnicht zu entschuldigen...
Mir ist was ganzschön peinliches passiert:o
Ich war ebenfalls auf der Seite die du mir gepostet hast, bevor ich das hier reingepostet habe und hab net gesehen, dass unten steht welche libary zum Projekt hinzuzufügen ist.
Also muss ich dir erstmal mein größten dank aussprechen für die Hilfe mit Winmm.lib,denn es klappt wunderbar.
Mein zweiter dank gebührt dir ebenfalls weil ich jetzt mehr über die Seite weiß die wirklich hilfreich ist...
Hab aber doch noch eine Frage....
Weißt du wie ich den Sound im hintergrund abspielen lassen kann?

blackberry
26.04.2009, 19:18
Das sollte mit Threads möglich sein.
Um einen simplen Thread zu erstellen benutzt man die Funktion CreateThread.
Das ganze könnte so z.B. aussehen:


#include <windows.h>


DWORD WINAPI PlaySoundThread(void *file)
{
PlaySound((const char *) file, NULL, SND_FILENAME);
return 0;
}

int main(void)
{
/* [...] */
CreateThread(0, 0, PlaySoundThread, "music.wav", 0, NULL);
/* [...] */
return 0;
}
(ich bin gerade mit Ubuntu online und konnte den Code also nicht testen)


mfG. BlackBerry

jookerxxx
26.04.2009, 19:54
#include "common_header.h"
#include "monster.h"
#include "soldat.h"
using namespace std;

DWORD WINAPI PlaySoundThread(void *file)
{
PlaySound((const char *) file, NULL, SND_FILENAME);
return 0;
}



int main(){

int AgentenWahl = 0;




Monster Org(100, 100, 100);

Sleep(3000);



CreateThread(0, 0, PlaySoundThread, "music.wav", 0,);

do{
system("CLS");
cout<<"\t\t -------------The Game-------------"<<endl<<endl;

cout<<"\t\t Wähle deinen Agenten aus:"<<endl<<endl;

cout<<"\t\t 1. \t\tJohn"<<endl;
cout<<"\t\t 2. \t\tTommy"<<endl;
cout<<"\t\t 3. \t\tJason"<<endl;
cout<<"\t\t 4. \t\tJack"<<endl;
cout<<"\t\t 5. \t\tSpiel Ende"<<endl;
cin>>AgentenWahl;
if(AgentenWahl > 4 && AgentenWahl != 5 || AgentenWahl <= 0){
cout<<"Fehler bei der Eingabe...Bitte versuche es erneut...";
getch();
}

if(AgentenWahl == 5){
exit (1);
}

switch(AgentenWahl){
case 1:
Soldat John();
cout<<"Du hast John gewählt"<<endl;
break;
case 2:
Soldat Tommy();
cout<<"Du hast Tommy gewählt"<<endl;
break;
case 3:
Soldat Jason();
cout<<"Du hast Jason gewählt"<<endl;
break;
case 4:
Soldat Jack();
cout<<"Du hast Jack gewählt"<<endl;
break;
}//Ende von switch



getch();

cout<<"Monsters Leben:"<<Org.get_Health()<<endl;
cout<<"Monsters Mana :"<<Org.get_Mana()<<endl;
cout<<"Monsters Särke:"<<Org.get_Strenght()<<endl;

Org.Monster_Attack();
Org.Monster_get_hit();

}while(AgentenWahl = 0);




return 0;
}


Das mein Code...der Error:
C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\main.cpp In function `int main()':
27 C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\main.cpp expected primary-expression before ')' token
C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\Makefile.win [Build Error] [main.o] Error 1

Ich hab den Parameter NULL am ende von CreateThread ewggenommen,
da er sonst den Fehler ausgegeben hat:

27 C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\main.cpp invalid conversion from `const void*' to `void*'

27 C:\Dokumente und Einstellungen\JOKO\Desktop\The Game\main.cpp initializing argument 4 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'

Was bedeutet denn das jetzt wenn der Compiler primary expression erwartet vor irgendetwas?

blackberry
26.04.2009, 21:43
Du hast falsch kopiert.
expected primary-expression before ')' token
bedeutet, dass vor dem ) noch ein Ausdruck erwartet wird.
CreateThread(0, 0, PlaySoundThread, "music.wav", 0,);
Das Komma leitet einen solchen Ausdruck ein, welchen du jedoch nicht angegeben hast.
Richtig wäre:
CreateThread(0, 0, PlaySoundThread, "music.wav", 0, NULL);

Der nächste Fehler war ein Fehler meinerseits.
invalid conversion from `const void*' to `void*'
Bedeutet, dass ein Cast erwartet wird.
Traditionell in C macht man das mit (typbezeichner) (die Klammern gehören dazu).
Folgende Anweisung sollte funktionieren:

CreateThread(0, 0, PlaySoundThread, (void *) "music.wav", 0, NULL);