Kapitel 19 · Doom 3

SOUNDEFFEKTE

Autor: Fragpoint
Downloads: Beispielmap 12

Wir lassen erst einmal unseren Teleporter links liegen. Um die Grundlage der Soundeffekte zu demonstrieren, wollen wir erst einmal ein besseres Raumambiente durch Klänge erzeugen. Wir setzen dazu im kleinen Raum einen "Lautsprecher". Dazu müssen wir wieder einen Rechtsklick in die Draufsicht machen und aus der Liste den Punkt "Speaker" (engl. Lautsprecher) auswählen.

image114.jpg

Der Speaker sollte in etwa mittig im Raum "schweben", da sein Sound gleichmäßig in alle Richtung gehen soll. Anschließend drücken wir die Taste N, um das Entity-Fenster aufzurufen und diesem Speaker einen Sound vorzugeben, den er abzuspielen hat.

image115.jpg

In diesem Fenster klicken wir - wie oben markiert - den Sound-Button an. Es öffnet sich ein neues Fenster, aus dem man verschiedene Sounds auswählen kann. Beachtet dabei, dass das dortige Verzeichnis "Sound Shaders" nur Sounds hat, die loopen. D.h. sie wiederholen sich ständig, was durch ein Shader-Script vorgegeben wird, das wir (noch) nicht beinflussen können. Soll ein Sound nur ein einziges Mal abgespielt werden, sind diese ungeeignet. Dann sollte man lieber welche aus dem Verzeichnis "Wave Files" verwenden. Da wir aber ein Sound haben wollen, der ständig abspielt, können wir gleich auf die "Sound Shaders" zurückgreifen.

image116.jpg

Das soll aber nicht heißen, dass die Geräusche aus dem Verzeichnis "Wave Files" nicht doch zum loopen gebracht werden können. Dazu später mehr bei den Entity-Befehlen für den Speaker. Ich habe für unsere Zwecke den Sound "Sound Shaders -> sound/rooms.sndshd -> loop_ambient_room_03" gewählt.

image117.jpg

Nachdem wir unsere Eingabe mit OK bestätigt haben, finden wir im Entity-Fenster folgenden neuen Eintrag:

image118.jpg

Das sagt dem Spiel später eigentlich nur, dass es den einen Sound-Shader abspielen soll. Vielleicht sollte ich auch noch kurz erwähnen, dass Sound-Shader in etwa das Gleiche sind, wie Textur-Shader. Bei den Sound-Shadern werden durch ein kleines Script Klänge verändert, so dass sie zum Beispiel loopen, oder lauter/leiser klingen, wie sie eigentlich aufgenommen wurden. Ich habe in der Beispielmap noch einen weiteren "Speaker" gesetzt, damit dort ebenfalls etwas mehr Geräuschkulisse vorhanden ist.

Euch ist sicher auch aufgefallen, dass dieses Entity (der Speaker) jede Menge weitere Befehle im Entity-Fenster zur Verfügung hat. Die Eingabe erfolgt wieder über diese beiden Felder (wir erinnern uns):

image068.jpg

Die einzelnen Befehle erklären sich wie folgt:

KEY: s_waitfortrigger
VALUE: Zahlenwert 0 oder 1
Der Speaker spielt seinen Sound erst ab, wenn er über einen Trigger, durch den zum Beispiel ein Spieler läuft, ausgelöst wird.

KEY: s_volume
VALUE: Zahlenwert
Wurde im Shader eine Lautstärke des Sounds vorgegeben, könnt Ihr diese durch einen Eintrag leiser oder lauter machen. Der Eintrag im Sound-Shader wird dann ignoriert.

KEY: s_minDistance
VALUE: Zahlenwerte
Die minimale Distanz/Entfernung bis zu der ihr den Sound hören könnt.

KEY: s_maxDistance
VALUE: Zahlenwerte
Die maximale Distanz/Entfernung bis zu der ihr den Sound hören könnt

KEY: s_looping
VALUE: Zahlenwert 0 oder 1
Gibt an, ob ein Sound loopen (ständig wiederholen) soll. Bei Sound-Shadern ist dies meist immer der Fall. Bei Wave-Sounds ist es sinnvoll - falls benötigt - hier das Looping zu aktivieren. Das Looping der Sound-Shaders lässt sich über diesen Befehl nicht deaktivieren!

KEY: s_global
VALUE: Zahlenwert 0 oder 1
Der Sound wird global, also mapweit abgespielt und ist überall zu hören

KEY: s_shakes
VALUE: Zahlenwert 0 oder 1
Über diesen Befehl ist es dem Entity möglich, den Bildschirm wackeln zu lassen, wenn der Sound sehr laut ist. Coole Funktion für Schockeffekte.

KEY: wait
VALUE: Zahlenwerte in Sekunden
Hier kann angegeben werden, dass der Sound erst nach X Sekunden abgespielt werden soll.

KEY: random
VALUE: Zahlenwerte
Der Sound wird nach einer zufälligen Wartezeit abgespielt.

KEY: s_shader
VALUE: Verzeichnis/Datei
Hier wird der abzuspielende Sound eingetragen. Dies erfolgt über den Sound-Button des Entity-Fensters.

KEY: snd_demonic
VALUE: ???
Funktion unbekannt

KEY: s_occlusion
VALUE: ???
Gibt an, ob ein Sound gleich laut bzw. überhaupt hörbar ist, wenn zwischen Spieler und Soundquelle eine Wand oder Tür ist.

KEY: s_omni
VALUE: Zahlenwerte
Unterstützt Omni-Directional. Darunter versteht man Sound "mit kugelförmiger Richtcharakteristik".

Tja, das waren mal wieder jede Menge Fakten. Jetzt wollen wir noch schnell unserem Teleporter einen Sound zuordnen. Wir setzen dazu sowohl beim Start- als auch beim Zielpunkt jeweils einen Speaker. Beide erhalten den gleichen Sound. Und zwar "Wave Files -> sound -> hell -> thunderclap_01a.wav". Ein etwas exotischer Teleport-Sound, aber es dient ja nur zur Demonstration.

image119.jpg

Weshalb wir diesmal einen Sound von dem Ordner "Wave Files" verwenden? Nun, wie schon erwähnt, loopen die Sounds aus dem Verzeichnis "Sound Shaders". Das benötigen wir hier aber nicht. Das Teleport-Geräusch soll nur einmal während des Beamens abgespielt werden und danach stoppen, bis sich der nächste Spieler beamt. Aber ein Problem haben wir momentan noch: Der Sound wird abgespielt, sofort nachdem die Map geladen wurde. Eigentlich sollte das aber erst erfolgen, wenn wir Teleportieren. Wie machen wir das den Speakern klar? Ganz einfach! Drückt erst einmal die ESC-Taste, um die Speaker abzuwählen. Markiert anschließend unseren Trigger-Brush, durch den der Spieler laufen muss, wenn er teleportiert werden soll. Anschließend markiert Ihr den ersten der beiden (Teleport)-Speaker. In meinem Fall wäre es der oben auf der Plattform. Drückt dann wieder Strg-K, um den Trigger-Brush mit dem Speaker zu verbinden.

image120.jpg

Ist alles in Ordnung, verläuft eine grünfarbene Linie vom Trigger-Brush zum Speaker. Diesen Vorgang wiederholen wir für den zweiten Speaker (vorher erst wieder die ESC-Taste drücken). Anschließend starten wir die Map und werden ein fettes Donnern hören, sobald wir uns teleportieren.

ANWENDUNGSBEISPIEL:
So könnt Ihr übrigens auch Spieler sehr gut schocken. Machen wir mal ein kleines Beispiel, bei dem ich allerdings nicht noch mal alles Stück für Stück erkläre. Ich setze ab sofort schon das erlernte Wissen voraus.
Baut direkt hinter unserer Schiebetür einen Brush, der genauso breit und hoch wie der Durchgang ist und bündig an die Türe anschließt. Macht daraus dann einen "trigger -> trigger_once". Vorher hatten wir den "trigger_multiple" verwendet. Dieser löst so oft ein Ereignis aus, wie ein Spieler durchläuft. Der "trigger_once" dagegen löst nur ein einziges mal ein Ereignis aus und ist danach inaktiv. Ideal für einen Schockeffekt, denn der wirkt ja auch nur, wenn er neu und überraschend ist. Ein weiteres Abspielen des Sounds würde dann keinen mehr erschrecken.
Durch diesen "trigger_once" wird der Spieler später durchlaufen und, ohne dass er es merkt, einen Schock-Sound auslösen (Er merkt es natürlich schon, aber erst wenn er vor Schreck vom Stuhl fällt *g*). Wir setzen deshalb einen Speaker ungefähr am Ende des Ganges auf Kopfhöhe der Spielfigur.

image121.jpg

Dem Speaker geben wir den Sound "Wave Files -> sound -> weapons -> pistol -> fire -> pfire_01.wav". Verbindet nun den Trigger (zuerst anwählen) und den Speaker über Strg-K. Der Pfeil muss immer vom Auslöser zum Ziel gehen.

image122.jpg

Auf diese Art und Weise könnt Ihr immer - vom Spieler unbemerkt - Ereignisse auslösen lassen, die diesen dann mehr oder weniger schocken. Sollte der Sound zu leise abgespielt werden, denkt daran, dass Ihr ihn über den Befehl s_volume lauter stellen könnt (vgl. Entity-Befehle weiter oben). Bild kann ich Euch leider keines bieten, Sound lässt sich so schwer darstellen :D Aber lauft doch einfach mal durch diese Tür und lasst Euch überraschen. Vorher aber bitte die Boxen schön laut aufdrehen, wir sind hier schließlich keine Weicheier sondern Mapper. Oder nehmt den kleinen Bruder zum Testen, wenn Euch das lieber ist, aber auf keinen Fall den Opa...
Sollte der Sound bei Euch gar nicht oder gleich nach dem Start der Map abgespielt werden, obwohl ihr noch nicht durch den Trigger gelaufen seid, solltet Ihr beim Speaker-Entity noch den Befehl s_waitfortrigger mit dem Wert 1 eintragen. Der Speaker wartet dann ganz sicher auf das OK des Triggers.