Mit Audio-Wiedergabe per DirectX habe ich mit bis dato nicht wirklich beschäftigt – schlicht noch nie gebraucht. Bei einem Spiel wie RK Rocket sieht das aber anders aus, denn wenn der Spieler feuert, ein Ziel trifft oder getroffen wird, sollte auch ein entsprechender Ton aus den Lautsprechern kommen. Neben der technischen Umsetzung gibt es für mich an dieser Stelle das Problem, den richtigen Content (=Sound-Dateien) zu bekommen, die auch zur Lizenz des Quellcodes von RK Rocket passen (=LGPL). Am Ende war beides glücklicherweise deutlich einfacher, als gedacht.
Sound-Wiedergabe per XAudio2
Nach kurzer Recherche bin ich relativ schnell auf XAudio2 gestoßen, da diese die aktuellste Audio-API im DirectX Paket ist (DirectSound ist veraltet). Mehrere Infos über XAudio finden sich z. B. unter [1] oder [2]. Gute Beispiele für XAudio2 zusammen mit SharpDX lassen sich direkt in den Samples von SharpDX finden [3]. In Seeing# habe ich die Soundwiedergabe relativ einfach eingebunden, und zwar gibt es eine Klasse SoundManager, welche für die Wiedergabe von Sounddateien zuständig ist und die Klasse CachedSoundFile, welche eine komplette Audio-Datei im Speicher hält (vgl. Bitmap beim 2D-Rendering). In RK Rocket lassen sich diese Klassen relativ einfach ansprechen. Im ersten Step werden die Audio-Dateien, die als Ressourcen im Projekt abgelegt sind, geladen:
/// <summary> /// Loads the audio files. /// </summary> private async void LoadAudioFiles() { m_soundLaserFire = await CachedSoundFile.FromResourceAsync( new AssemblyResourceUriBuilder( "RKRocket", true, "Assets/Sounds/LaserFire.wav")); m_soundBlogHit = await CachedSoundFile.FromResourceAsync( new AssemblyResourceUriBuilder( "RKRocket", true, "Assets/Sounds/BlogHit.wav")); m_soundBlogHit2 = await CachedSoundFile.FromResourceAsync( new AssemblyResourceUriBuilder( "RKRocket", true, "Assets/Sounds/BlogHit2.wav")); m_soundExplosion = await CachedSoundFile.FromResourceAsync( new AssemblyResourceUriBuilder( "RKRocket", true, "Assets/Sounds/Explosion.wav")); }
Danach werden die Dateien einfach abgespielt, sobald ein entsprechendes Ereignis im Spiel stattfindet. Die Dateien können dabei auch problemlos parallel abgespielt werden.
private void OnMessage_Received(MessageProjectileShooted message) { if(m_soundLaserFire != null) { GraphicsCore.Current.SoundManager.PlaySoundAsync(m_soundLaserFire) .FireAndForget(); } } private void OnMessage_Received(MessageCollisionProjectileToPlayerDetected message) { if(m_soundExplosion != null) { GraphicsCore.Current.SoundManager.PlaySoundAsync(m_soundExplosion) .FireAndForget(); } }
Das war es dann auch schon. Ein kleiner Nachteil, der mir bis jetzt aufgefallen ist, ist die fehlende Unterstützung für MP3. Im Prinzip verwende ich bei RK Rocket jetzt einfache, unkomprimierte WAV-Dateien. Für ein Spiel dieser Größe ist das aber glücklicherweise kein Problem. Die beiden Klassen CachedSoundFile und SoundManager liegen hier auf Github [4].
Sound-Dateien für RK Rocket
Das zweite Problem war natürlich, erst einmal richtige Audio-Dateien zu finden. An dieser Stelle hab ich mir anfangs definitiv Gedanken gemacht, ob ich da etwas finde, was auch zur Lizenz von RK Rocket passt, also frei verwendbar ist. Eigentlich schon fast zufällig bin ich über das Forum Spieleprogrammierer.de [5] auf verschiedene Seiten eben für solche Assets gestoßen. Die Sound-Dateien, die ich letzten Endes für RK Rocket verwendet habe, stammen von opengameart.org [6]. Für alle Dateien, die ich hier herunterlade, habe ich mir gleich angewöhnt, jeweils eine Text-Datei in das C#-Projekt zu legen, welches die Infos zur jeweiligen Lizenz enthält.
Eine solche LicenseInfo Datei sieht dann beispielsweise so aus:
Creative Commons 3.0 Attribution License, last checked 2016-01-09 http://opengameart.org/content/metal-sounds
Verweise
- https://en.wikipedia.org/wiki/XAudio2
- https://msdn.microsoft.com/en-us/library/windows/desktop/ee415813(v=vs.85).aspx
- https://github.com/sharpdx/SharpDX-Samples/tree/master/Desktop/XAudio2
- https://github.com/RolandKoenig/SeeingSharp/tree/master/SeeingSharp.Multimedia/PlayingSound
- https://www.spieleprogrammierer.de/33-links-und-bücher/25173-asset-fundstücke-aus-dem-internet/
- http://opengameart.org