Sounds und Geräusche in Spielen



  • Hi,
    da Sound und Musik ebenfalls ein Kapitel der Spieleprogrammierung ist, dachte ich mir frage ich hier doch mal rund, was vielleicht nicht selbst ganz in die Programmierung passt.
    Also, was vor allem in Rennspielen (a.k.a. NFSU, und Co.) vorkommt, sind diese Motorengeräusche/-töne. Und ich frage mich, ob diese erst noch berechnet werden? Ich könnte mir das als einzelne Frequenzen in mehreren Spulen vorstellen. Oder aber sind die je nach Drehzahl "statisch" vorgegeben?
    Und da dachte ich auch gleich, wie das im Verhältnis der Effizienz steht - eine Vielzahl weniger an Speicherplatzbenötigung - oder langsamerer Laufzeit.



  • Theoretisch reicht tatsächlich ein Sound, den du einfach je nach Motordrehzahl langsamer und schneller laufen lässt. Aber wirklich gut funktioniert das nur, wenn es noch ein paar andere Sounds gibt, sonst hört sich das eintönig (=nervig) an, wie eben auch ein echter Motor so ist ;). Was man aber noch einbauen kann, sind spezielle Effekte beim Schalten (bei Colin McRae zum Beispiel gut zu hören) oder ein "Tuckern" wenn der Motor untertouring läuft (ok, hört man dann eher selten).

    Bye, TGGC (Der Held ist zurück)



  • Hey,

    meine Frage passt gleich zu dem Titel:

    Ich bau grad noch etwas Sound in mein Game ( siehe
    http://www.c-plusplus.net/forum/viewtopic.php?t=67422 )
    Die Initialisierung von Direct Audio is soweit drinn:

    CoInitialize(NULL);
    
    CoCreateInstance(CLSID_DirectMusicPerformance, NULL,
                     CLSCTX_INPROC, IID_IDirectMusicPerformance8,
                     (void**)&lpPerformance );
    
    CoCreateInstance(CLSID_DirectMusicLoader, NULL, 
                     CLSCTX_INPROC, IID_IDirectMusicLoader8,
                     (void**)&lpLoader);
    

    Dabei kommt aber immer bei der Initialisierung von den "CoCreateInstance" folgender Fehler:

    "[Linker Fehler] Unresolved external '_IID_IDirectMusicPerformance8' referenced from D:\NEO GENESIS\DIRECTAUDIO.OBJ"

    Muss ich noch diverse Libraries linken? Bzw welche? Ich benutz C++Builder5 und DX-SDK8.

    Danke, Alfred



  • alfredQ schrieb:

    [Linker Fehler] Unresolved external '_IID_IDirectMusicPerformance8' referenced from D:\NEO GENESIS\DIRECTAUDIO.OBJ

    Muss ich noch diverse Libraries linken? Bzw welche? Ich benutz C++Builder5 und DX-SDK8.

    Ja, mußt Du.
    Suche in der DX Doku nach IDirectMusicPerformance8.
    Unten steht, welche Header und Librarys Du brauchst. 😮



  • Da steht leider nur, dass alle benöitgten Header in "dmusici.h" drinn sind, aber nix von Libraries!? Welche brauch ich denn nun noch?



  • in der msdn stehts bestimmt



  • Diese _IID_ ist eine GUID ( globally unique identifier ), und liegt sicher in dxguid.lib.

    *malschnellnachschau*

    Im DX9SDK unter DirectMusic -> Getting Started With DirectMusic -> Building DirectMusic Projects steht's aber auch genau beschrieben:

    You must also ensure that your application has access to the GUIDs used by DirectMusic. Define INITGUID before all other preprocessor directives, or link to Dxguid.lib.

    Statt dem Dazulinken reicht also (mittlerweile) auch:

    #define INITGUID
    #include <dmusici.h>

    -> Das gilt für DX9SDK, bei DX8SDK weiß ich nicht... ➡ ⚠



  • Ja, jetzt funktioniert es...relativ.
    Meistens kommt beim Compilieren Warnung:

    [C++ Warnung] winioctl.h(39): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden.

    Nachdem ich aber ca. 5x in der Unit was geändert und neu compiliert hab kommt ein
    "[C++ Fataler Fehler] DirectAudio.cpp(184): F1004 Interner Compiler-Fehler at 0x12a1300 with base 0x1200000"

    Dann muss ich das #define INITGUID auskommentieren, compilieren, die // löschen und dann gehts wenigstens wieder mit der Meldung oben ab. Das nervt aber alle 10 mins diese Prozedur zu wiederholen..is der Fehler ( oder besser ne Lösung ) bekannt?

    Alfred



  • alfredQ schrieb:

    Ja, jetzt funktioniert es...relativ.
    Meistens kommt beim Compilieren Warnung:

    [C++ Warnung] winioctl.h(39): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden.

    Nachdem ich aber ca. 5x in der Unit was geändert und neu compiliert hab kommt ein
    "[C++ Fataler Fehler] DirectAudio.cpp(184): F1004 Interner Compiler-Fehler at 0x12a1300 with base 0x1200000"

    Dann muss ich das #define INITGUID auskommentieren, compilieren, die // löschen und dann gehts wenigstens wieder mit der Meldung oben ab. Das nervt aber alle 10 mins diese Prozedur zu wiederholen..is der Fehler ( oder besser ne Lösung ) bekannt?

    Ich denke nicht.
    "Interne Compiler-Fehler" sollten ja eigentlich nur auftreten, wenn die Jungs bei MS den Compiler beschis*en geproggt hätten. Im Zusammenhang mit Deinem präkompilierten-Header-Problem würde ich dieses "Caching" als Ursache einschätzen...



  • Also einfach das Problem irgnorieren?



  • alfredQ schrieb:

    Also einfach das Problem irgnorieren?

    Halt testweise präkompilierte Header mal ausschalten...
    Codeerzeugung dauert dann u.U. länger...


Log in to reply