Stop(DMUS_SEGF_DEFAULT ); if(pSound) pSound- >SetRepeats(DMUS_SEG_REPEAT_INFINITE ); if(pSound) pSound->Play( DMUS_SEGF_DEFAULT ); } inline void StopMusic(CMusicSegment* pSound ) { if( pSound ) pSound->Stop(DMUS_SEGF_DEFAULT ); } inline void NewVolume( long Volume ) { // wirkt sich auf alle Musik und Sound-Segmente aus g_pBackgroundMusic->SetVol(Volume ); } // Funktionsdefinitionen void CreateSoundObjects(HWND handle) { // CMusicManager-Objekt erzeugen: g_pMusicManager = new CMusicManager(); g_pMusicManager->Initialize(handle); g_pMusicManage-> CreateSegmentFromFile(&g_pBackgroundMusic, "Backgroundmusic.wav"); } void DestroySoundObjects(void) if(g_pMusicManager) g_pMusicManager->StopAll(); SAFE_DELETE(g_pBackgroundMusic) SAFE_DELETE( g_pMusicManager )">

Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Hintergrungmusik abspielen 3D-Soundeffekte einsetzen.

Ähnliche Präsentationen


Präsentation zum Thema: "Hintergrungmusik abspielen 3D-Soundeffekte einsetzen."—  Präsentation transkript:

1 Hintergrungmusik abspielen 3D-Soundeffekte einsetzen

2 DirektX Audion und Hintergrundmusik DirectX 8 DirectMusik DirectSound DirectX Audio Folgende Klassen wurden eingeführt: CMusicManager CMusicSegment CMusicScript DirectX 9 Bekam zusätzlich die Klasse C3DMusicSegment, die den Einsatz von 3D-Sondeffekten erleichtert. Deklaration und Implementierung der Klassen in dmutil.h/cpp Wir spielen Musik mit Hilfe der Klassen CMusicManager und CMusicSegment ab. Alle hierfür notwendigen Funktionalitäten sind in der Datei GoodSound.h implementiert. Die Datei wird auf folgende Weise in unser Projekt eingebunden: …. #include „GoodSound.h“ // neu void InitSpieleinstellungen (void); void CleanUpD3D(void); void InitD3D(void); void Init_View_and_Projection_Matrix(void); void Show_3D_Scenario(void); void PlayBackgroundMusic (long Nr); // neu void StopBackgroundMusic (long Nr); // neu #include „GiveInput.h“ // neu

3 GoodSound.h // GoodSound.h --- Sound und Musik #include "dmutil.h" // GLOBALS CMusicManager* g_pMusicManager = NULL; // Soundobjekte: CMusicSegment* g_pBackgroundMusic = NULL; // Funktionsprototypen void CreateSoundObjects(HWND handle); void DestroySoundObjects(void); // INLINES } inline void PlayMusic(CMusicSegment* pSound ) { if(pSound) pSound->Stop(DMUS_SEGF_DEFAULT ); if(pSound) pSound- >SetRepeats(DMUS_SEG_REPEAT_INFINITE ); if(pSound) pSound->Play( DMUS_SEGF_DEFAULT ); } inline void StopMusic(CMusicSegment* pSound ) { if( pSound ) pSound->Stop(DMUS_SEGF_DEFAULT ); } inline void NewVolume( long Volume ) { // wirkt sich auf alle Musik und Sound-Segmente aus g_pBackgroundMusic->SetVol(Volume ); } // Funktionsdefinitionen void CreateSoundObjects(HWND handle) { // CMusicManager-Objekt erzeugen: g_pMusicManager = new CMusicManager(); g_pMusicManager->Initialize(handle); g_pMusicManage-> CreateSegmentFromFile(&g_pBackgroundMusic, "Backgroundmusic.wav"); } void DestroySoundObjects(void) if(g_pMusicManager) g_pMusicManager->StopAll(); SAFE_DELETE(g_pBackgroundMusic) SAFE_DELETE( g_pMusicManager )

4 Abspielen und Beenden von Hintergrundmusik Der Aufruf von den Funktionen PlayMusic() und StopMusic() erfolgt nicht direkt, sondern durch die Funktionen PlayBackgroungMusic() und StopBackgroundMusic(). Die Auswahl eines Musiksegments erfolgt durch einen Index: // Funktionen zum Abspielen und Stoppen der Hintergrundmusik void PlayBackgroundMusic(long Nr) { if(Nr == 1) PlayMusic(g_pBackgroundMusic); } void StopBackgroundMusic(long Nr) { if(Nr == 1) StopMusic(g_pBackgroundMusic); } Damit beide Methoden bei Programmstart bzw. -ende durch die Methoden GameInitialisierungs Routine() bzw. GameCleanUpRoutine() Aufgerufen werden, müssen sie in in der Datei GameRoutines.h als Externals deklariert werden.

5 3D-Sound-Demoprogramm MIDI -MIDI (Musical Instrument Digital Interface) -stellt keine Klänge dar, besteht aus Befehlen zur Ansteuerung von Instrumenten oder einer Soundkarte. -Qualität der Wiedergabe abhängig von der Soundkarte. WAVE - WAVE - Format zur digitalen Speicherung von Audiodaten. - Beansprucht viel Speicherplatz, klingt aber beim Abspielen besser.

6 Arbeitsweise von DirectX Audio Für jedes Soundsample legt man einen sekundären Soundbuffer an. Wenn mehrere Samples abgespielt werden sollen, werden sie in den primären Soundbuffer kopiert und abgemischt. Sekundäre Soundbuffer Primärer Soundbuffer 3D-Sound wird mit Hilfe von AudioPath erzeugt. AudioPath enthält: -3D-Soundbuffer -3D-Sound-Listener Der Klang hängt ab von : -der Position und Geschwindigkeit der Schallquelle -der Position, Geschwindigkeit und Orientierung des Listeners. Die Orientierung des Listeners wird durch zwei Vektoren beschrieben: -Kopfhaltung- vOrientTop -Blickrichtung- vOrientFront. Beide Vektoren sind senkrecht zueinander.

7 Parameter für die Wiedergabe von 3D-Sounds festlegen / Name: Set3DParameters // Desc: // VOID CMusicManager::Set3DParameters( FLOAT fDistanceFactor, FLOAT fDopplerFactor, FLOAT fRolloffFactor ) { m_dsListenerParams.flDistanceFactor = fDistanceFactor; m_dsListenerParams.flDopplerFactor = fDopplerFactor; m_dsListenerParams.flRolloffFactor = fRolloffFactor; if( m_pDSListener ) m_pDSListener->SetAllParameters( &m_dsListenerParams, DS3D_IMMEDIATE ); } for (z=0; zSetAllParameters( &g_dsBufferParams[z], DS3D-IMMEDIATE); }

8 Parameter für die Wiedergabe von 3D-Sounds festlegen - Doppelfaktor- beschreibt die Frequenz einer Schallquelle, wenn sich diese relativ zum Listener bewegt. Bewegen sich Schallquelle und Listener a)zueinander- erhöht sich die Frequenz (Ton wird höher) b)voneinander weg- verringert sich die Frequenz (Ton wird tiefer) - Rolloff-Faktor - beschreibt die Schallintensität gleichbleibende Intensität - 1- simuliert natürliche Verhältnisse - minimale Distanz -Entfernung, ab der sich die Schallintensität nicht mehr erhöht - maximale Distanz - Entfernung, ab der die Schallquelle nicht mehr zu hören ist) - g_dsListenerParams und g_dsBufferParams werden zum Zwischenspeichern der 3D- Soundparameter verwendet.

9 Soundobjekte erzeugen void CreateSoundObjects (HWND handle) { // CMusicManager-Objekt erzeugen g_pMusicManager = new CMusicManager(); g_pMusicManager ->Initialize (handle); g_pMusicManager ->CreateSegmentFromFile ( &g_pBackgroundMusic, „Bachgroundmusic.wav“ ) g_pMusicManager ->CreateSegmentFromFile ( &g_pExplosion, „Explosion.wav“ ); pPerformance = g_pMusicManager->GetPerformance (); for ( z= 0; z < Buffer3DMax; z++) pPerformance->CreateStandardAudioPath ( DMUS_APATH_DYNAMIC_3D, 1, TRUE, &g_p3DAudioPath[z] ); for ( z= 0; z < Buffer3DMax; z++) g_p3DAudioPath[z] ->GetObjectInPath (0, DMUS_PATH_BUFFER,0, GUID_NULL, 0, IID_IDirectSound3DBuffer, (LPVOID*) _&g_pDS3DBuffer[z] ); for ( z= 0; z < Buffer3DMax; z++) { g_dsBufferParams [z].dwSize = sizeof (DS3DBUFFER); g_pDS3DBuffer[z] -> GetAllParameters (&g_dsBufferParams[z] ); g_dsBufferParams [z].dwSize = DS3DMODE_NORMAL g_pDS3DBuffer[z] -> SetAllParameters ( &g_dsBufferParams[z], DS3D_IMMEDIATE ); for ( z= 0; z < Buffer3DMax; z++) g_p3DAudioPath[z] -> GetObjectInPath (0, DMUS_PATH_PRIMERY_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DListener, (LPVOID*), &g_pDsListener); memcpy ( &g_dsListenerParams.vOrientTop, &PlayerVertikaleOriginal, size0f (D3DVECTOR) ); memcpy ( &g_dsListenerParams.vOrientFront, &PlayerFlugrichtungOriginal, size0f (D3DVECTOR) ); g_pDSListener ->SetOrientierung ( g_dsListenerParams. vOrientFront.x, g_dsListenerParams. vOrientFront.y, g_dsListenerParams. vOrientFront.z, g_dsListenerParams. vOrientTop.x,

10 3D-Soundbuffer vor dem Abspielen ausrichten VOID C3DMusicSegment::SetObjectProperties( D3DVECTOR* pvPosition, D3DVECTOR* pvVelocity ) { D3DMatrixInverse (&tempMatrix, &tempFloat, &g_ObjectKorrekturMatrix); MultiplyVectorWithRotationMatrix ( &Position, pvPosition, &tempMatrix); MultiplyVectorWithRotationMatrix ( &Velocity, pvVelocity, &tempMatrix); memcpy( &m_dsBufferParams.vPosition, pvPosition, sizeof(D3DVECTOR) ); memcpy( &m_dsBufferParams.vVelocity, pvVelocity, sizeof(D3DVECTOR) ); if( g_pDS3DBuffer[x] ) { g_pDS3DBuffer[x]->SetPosition ( g_dsBufferParams[x].vPosition.x, g_dsBufferParams[x].vPosition.y, g_dsBufferParams[x].vPosition.z, DS3D_IMMEDIATE); g_pDS3DBuffer[x]->SetPosition ( g_dsBufferParams[x].vVelocity.x, g_dsBufferParams[x].vVelocity.y, g_dsBufferParams[x].vVelocity.z, DS3D_IMMEDIATE); }

11 3D-Sound abspielen inline void Play3DSound (CMusicSegment* pSound) { if (pSound) { pSound->play(DMUS_SEGF_SECONDARY, g_p3DAudioPath[x]); x++; } if (x == Buffer3DMax) x=0; }

12 Die neue Datei GoodSound.h #include "dmutil.h" #include // GLOBALS long x = 0; // Indices für den Zugriff long z = 0; // auf das Audiopath-Array D3DXVECTOR3 Position; D3DXVECTOR3 Velocity; const long Buffer3DMax = 10; // bis zu 10 Explosions-Sounds gleichzeitig CMusicManager* g_pMusicManager = NULL; IDirectMusicAudioPath* g_p3DAudioPath[Buffer3DMax]; IDirectSound3DBuffer* g_pDS3DBuffer[Buffer3DMax]; IDirectSound3DListener* g_pDSListener = NULL; DS3DBUFFER g_dsBufferParams[Buffer3DMax]; DS3DLISTENER g_dsListenerParams; // Soundobjekte: CMusicSegment* g_pBackgroundMusic = NULL; CMusicSegment* g_pExplosion = NULL; // Funktionsprototypen void CreateSoundObjects(HWND handle); void Set3DSoundParameters(float fDopplerFactor, float fRolloffFacto float fMinDistance, float fMaxDistance); void DestroySoundObjects(void); // INLINES inline void PlayMusic( CMusicSegment* pSound ) { if(pSound) pSound->Stop(DMUS_SEGF_DEFAULT ) if(pSound) pSound- >SetRepeats(DMUS_SEG_REPEAT_INFINITE ); if(pSound) pSound->Play( DMUS_SEGF_DEFAULT ); } inline void StopMusic( CMusicSegment* pSound ) { if( pSound ) pSound->Stop(DMUS_SEGF_DEFAULT ); } inline void NewVolume( long Volume ) { // wirkt sich auf alle Musik und Sound-Segmente aus g_pBackgroundMusic->SetVol(Volume ); } inline void Play3DSound(CMusicSegment* pSound) { if(pSound) { pSound->Play(DMUS_SEGF_SECONDARY, g_p3DAudioPath[x]); x++; } if(x == Buffer3DMax) x = 0; }

13 Die neue Datei GoodSound.h inline void Set3DSoundObjectProperties(D3DXVECTOR3* pvPosition, D3DXVECTOR3* pvVelocity) { D3DXMatrixInverse(&tempMatrix, &tempFloat, &g_ObjectKorrekturMatrix); MultiplyVectorWithRotationMatrix(&Position, pvPosition, &tempMatrix); MultiplyVectorWithRotationMatrix(&Velocity, pvVelocity, &tempMatrix); memcpy(&g_dsBufferParams[x].vPosition, &Position, sizeof(D3DVECTOR) ); memcpy(&g_dsBufferParams[x].vVelocity, &Velocity, sizeof(D3DVECTOR) ); if( g_pDS3DBuffer[x] ) { g_pDS3DBuffer[x]- >SetPosition(g_dsBufferParams[x].vPosition.x, g_dsBufferParams[x].vPosition.y, g_dsBufferParams[x].vPosition.z, DS3D_IMMEDIATE ); g_pDS3DBuffer[x]->SetVelocity(g_dsBufferParams[x].vVelocity.x, g_dsBufferParams[x].vVelocity.y, g_dsBufferParams[x].vVelocity.z, DS3D_IMMEDIATE ); } // Funktionsdefinitionen void CreateSoundObjects(HWND handle) { // CMusicManager-Objekt erzeugen: g_pMusicManager = new CMusicManager(); g_pMusicManager->Initialize(handle); g_pMusicManager- >CreateSegmentFromFile(&g_pBackgroundMusic, "Backgroundmusic.wav"); g_pMusicManager->CreateSegmentFromFile(&g_pExplosion, "Explosion.wav"); } IDirectMusicPerformance8* pPerformance = NULL; pPerformance = g_pMusicManager->GetPerformance(); for(z = 0; z < Buffer3DMax; z++) pPerformance- >CreateStandardAudioPath(DMUS_APATH_DYNAMIC_3D, 1, TRUE, &g_p3DAudioPath[z]) ; for( z = 0; z < Buffer3DMax; z++ ) g_p3DAudioPath[z]->GetObjectInPath (0,DMUS_PATH_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DBuffer, (LPVOID*) &g_pDS3DBuffer[z] ) ;

14 Die neue Datei GoodSound.h for( z = 0; z < Buffer3DMax; z++ ) { g_dsBufferParams[z].dwSize = sizeof(DS3DBUFFER); g_pDS3DBuffer[z]->GetAllParameters( &g_dsBufferParams[z] ); g_dsBufferParams[z].dwMode = DS3DMODE_NORMAL ; g_pDS3DBuffer[z]->SetAllParameters( &g_dsBufferParams[z], DS3D_IMMEDIATE ); } for(z = 0; z < Buffer3DMax; z++) g_p3DAudioPath[z]- >GetObjectInPath(0,DMUS_PATH_PRIMARY_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DListener, (LPVOID*) &g_pDSListener) ; memcpy(&g_dsListenerParams.vOrientTop, &PlayerVertikaleOriginal, sizeof(D3DVECTOR) ); memcpy(&g_dsListenerParams.vOrientFront, &PlayerFlugrichtungOriginal, sizeof(D3DVECTOR) ); g_pDSListener->SetOrientation (g_dsListenerParams.vOrientFront.x, g_dsListenerParams.vOrientFront.y, g_dsListenerParams.vOrientFront.z, g_dsListenerParams.vOrientTop.x, g_dsListenerParams.vOrientTop.y, g_dsListenerParams.vOrientTop.z, DS3D_IMMEDIATE ); void DestroySoundObjects(void) { if(g_pMusicManager) g_pMusicManager->StopAll(); SAFE_DELETE(g_pBackgroundMusic) SAFE_DELETE(g_pExplosion) SAFE_RELEASE(g_pDSListener) for(z = 0; z < Buffer3DMax; z++) { SAFE_RELEASE(g_pDS3DBuffer[z]) SAFE_RELEASE(g_p3DAudioPath[z]) } SAFE_DELETE(g_pMusicManager) } void Set3DSoundParameters(float fDopplerFactor, float fRolloffFactor, float fMinDistance, float fMaxDistance ) { g_dsListenerParams.flDopplerFactor = fDopplerFactor; g_dsListenerParams.flRolloffFactor = fRolloffFactor; g_dsListenerParams.vPosition.x = 0; g_dsListenerParams.vPosition.y = 0; g_dsListenerParams.vPosition.z = 0; if( g_pDSListener ) g_pDSListener->SetAllParameters( &g_dsListenerParams, DS3D_IMMEDIATE );

15 Die neue Datei GoodSound.h for( z = 0; z < Buffer3DMax; z++ ) { g_dsBufferParams[z].flMinDistance = fMinDistance; g_dsBufferParams[z].flMaxDistance = fMaxDistance; if( g_pDS3DBuffer[z] ) g_pDS3DBuffer[z]- >SetAllParameters( &g_dsBufferParams[z], DS3D_IMMEDIATE ); } Zum Testen der 3D-Soundfunktionen werden in der Funktion Show_3D-Scenario () nach dem Zufallsprinzip Positions- und Geschwindigkeits- angaben erzeugt. Nachdem SetObjectProperties() ausgerichtet wurde, wird das Explosionssample abgespielt.


Herunterladen ppt "Hintergrungmusik abspielen 3D-Soundeffekte einsetzen."

Ähnliche Präsentationen


Google-Anzeigen