|
Sounds und Musik |
Top Previous Next |
|
In diesem Workshop lernen Sie alles über Sounds und Musik. Schauen wir uns zunächst eine Tabelle mit den wichtigsten Multimedia Anweisungen an.
Wie Sie sehen werden für die meisten Anwendungen nur die media_xyz Anweisungen benötigt; die älteren snd_xyz Befehle sind aber dennoch wirkungsvoll, weil sie schon zum Spielstart die Geräusche in den Speicher laden und nicht erst zur Laufzeit (wie media_xyz) und daher bieten sie sich an, wenn ein längeres Geräusch abgespielt werden soll. Keine Sorge, wir werden gleich ins Detail gehen.
Wenn Sie nicht gern programmieren, können Sie die Geräusche auch einfach im WED plazieren, wie im Bild gezeigt.
Dies plaziert einen 3D Sound im Level; das "Object Properties" Fenster erlaubt uns einige Einstellungen vorzunehmen.
Dies ist eine gute Methode, um Maschinengeräusche oder eine unheimliche Kulisse zu erzeugen; viele Effekte erreicht man aber erst, wenn man einige Zeilen Code schreibt. Also, worauf warten wir? Zunächst spielen wir ein Geräusch ab! Starten Sie WED, laden Sie work38.wmp und starten Sie das Projekt mit script38.wdl.
Ich gebe ja zu, dass es nicht allzu aufregend aussieht, aber es geht ja zunächst um Geräusche. Drücken Sie "1", um ein Geräusch abzuspielen; wenn Sie Kopfhörer oder gute Boxen haben, werden Sie bemerken, dass es in stereo aufgenommen ist. Seien Sie nicht schüchtern, drücken Sie ruhig öfter auf die "1"! Hier ist der Code, der das Geräusch abspielt:
function play_media() { media_play("hammer.wav", NULL, 80); }
on_1 = play_media;
Wie Sie sehen benötigt die Anweisung für dne Sound drei Parameter:
media_play(name, target, volume); - name ist der Name des Sounds oder des Videos, das gespielt werden soll. Ja, mit dieser Funktion können auch Videos abgespielt werden; - target ist ein Zeiger auf eine Bitmap, welche als Zieltextur eines Videostreams dient, falls vorhanden. Da wir das an dieser Stelle nicht vorhaben, ist einfach NULL eingesetzt. Falls Sie einen Film auf einem Sprite oder dem Skin eines Models abspiele wollen, finden Sie Beispiele dazu in früheren AUM Ausgaben; - volume reguliert die Lautstärke des Sounds (zwischen 0 und 100).
Zeit, die "2" zu drücken; das ruft eine Funktion auf, die ein Musikstück in einer Schleife abspielt.
function loop_media() { media_loop("atmosphere.wav", NULL, 80); }
on_2 = loop_media;
Wie Sie sehen hat media_loop die gleiche Syntax wie media_play. Hören Sie sich die Schleife einige Male an und Sie werden eine kurze Verzögerung bemerken - das ist der benötigte Zeitraum, das Stück von der Festplatte zu laden, denn alle media_xyz Anweisungen greifen auf den Windows Media Player zurück und müssen seine Funktionen nutzen. Die Lösung zu diesem Problem ist simpel: Wir können Acknex' eingebauten MCI-basierten Player verwenden. MCI steht für "Media Control Interface", falls es Sie interessiert.
Aber das brauchen Sie nicht zu wissen, ich habe es selbst nachschlagen müssen ;). Drücken Sie "3", um dieselbe Schleife nochmal mit snd_loop zu hören:
sound atmosphere_wav = <atmosphere.wav>;
function loop_media_ok() { snd_loop(atmosphere_wav, 80, 0); // use snd_play and snd_loop for short sounds that have to be preloaded in memory }
on_3 = loop_media_ok;
Dieses Mal funktioniert die Schleife perfekt, weil der Sound im Vorfeld definiert und daher schon zu Beginn des Spiels in den Speicher geladen wurde. Die snd_loop Anweisung hat eine etwas andere Syntax:
snd_loop (name, volume, balance); - name ist der Name des Sounds, der abgespielt werden soll. Stellen Sie sicher, dass er vorher als sound definiert wurde, das ist für snd_loop unerlässlich; - volume reguliert die Lautstärke (0 bis 100); - balance kann im Bereich von -100 bis +100 eingestellt werden und teilt der Engine mit, den Sound nur auf dem linken, dem rechten oder einer Kombination aus beiden Lautsprechern abzuspielen. Der voreingestellte Wert von 0 erzeugt ein gleichmäßiges Geräusch auf beiden Seiten.
Die snd_play Anweisung teitl sich die Syntax mit snd_loop und spielt einen Sound nur einmal ab, wieder mit Hilfe des MCI; ich habe snd_play in einigen vorigen Workshops genutzt, es sollte Ihnen also vertraut sein. Dies ist die Anweisung, die Sie verwenden sollten um Soundeffekte in Ihr Spiel zu bringen, weil die Dateien vorher schon in den Speicher geladen werden. Wenn 10 Kugeln pro Sekunde abgefeuert werden, wäre es unsinnig dafür jedes Mal das Geräusch von der Festplatte zu laden, also sollte media_play dafür nicht genutzt werden, nicht wahr? Auf der anderen Seite können die media_xyz auch Stereo Sound spielen, verbrauchen weniger Ressourcen und sind nicht auf 32 Sounds, die zugleich hörbar sind, begrenzt, es gibt also auch Vorteile. Wenn Sie diese Punkte beachten, sollten Sie in der Lage sein, jedes Mal die geeignete Methode zu wählen, um Sounds abzuspielen.
Wie kontrollieren wir die Geräusche? Bislang habe ich mit einer Brute-Force Methode gearbeitet, die alle Geräuschestoppt, wenn "0" gedrückt wird. Aber wie können wir eine bestimmte Sounddatei kontrollieren oder stoppen? Zunächst müssen wir dieser eine eindeutige ID zuweisen, ähnlich einem Pointer, der einer Entity zugewiesen wird. Ich überlasse den Rest der Erklärung vorerst dem Code.
var music_handle; // the built in "media_handle" can be used as well
function stoppable_media() { music_handle = media_loop("atmosphere.wav", NULL, 80); // play the sound in a loop sleep (5); media_stop (music_handle); // stop the playback after 5 seconds }
on_4 = stoppable_media;
Wir haben eine gewöhnliche Variable namens music_handle deklariert; es kann auch die vordefinierte Variable media_handle genutzt werden, aber wenn Sie mehr als einen Stream abspielen (ein Sound, ein Film, ein Bild, ...), dann ist es besser, für jeden ein Handle zu haben.Dieser wird als Ergebnis der media_loop Anweisung zugewiesen und kann die entsprechende Datei kontrollieren, während sie abgespielt wird. Am Rande, ich habe keine Ahnung, warum Sie ein Bild mit media_play oder media_loop "spielen" wollen würden, aber ich bin auch nicht so erfindungsreich.
Zurück zum Code: Drücken Sie die "4" und Sie hören die Schleife 5 Sekunden lang, weil die media_stop Anweisung ihn nach 5 Sekunden anhält. Ich muss ja sagen, dass es am Ende etwas abrupt klang, ein Fade-Out wäre schöner, richtig?
Richtig! Drücken Sie also schon mal auf die "5", während ich den Code für die nächste Funktio einfüge:
var musicok_handle;
function stoppable_media_fade() { var tune_factor = 80; // play the sound at an initial volume of 80 musicok_handle = media_loop("atmosphere.wav", NULL, 80); // use the same value here sleep (7); // play the sound for 7 seconds while (tune_factor > 0) // now change its volume, decreasing it gently { media_tune(musicok_handle, tune_factor, 100, 0); tune_factor -= 0.8 * time_step; // with the speed given by 0.8 wait (1); } media_stop (musicok_handle); // the volume is zero here, so we can stop the sound }
on_5 = stoppable_media_fade;
Das nenne ich einen schönen Fade-Effekt! Die Schlüsselanweisung hier ist media_tune, mit der folgenden Syntax:
media_tune(handle, volume, speed, balance); - handle ist ein vorher definiertes Handle auf das entsprechende Geräusch oder den Film; - volume bezeichnet die Lautstärke und kann auf einen Wert zwischen 1 und 100 geändert werden. Ein Wert von 0 hier lässt die Lautstärke einfach unverändert. - speed reguliert die Geschwindigkeit, mit der die Datei abgespielt wird. Ein Wert von 50 spielt die Datei mit 50% der Originalgeschwindigkeit ab, während der Wert 200 die Geschwindigkeit verdoppelt. Ein Wert von 100 lässt alles unverändert; - balance kann den Balance-Wert des Sounds ändern, negative Werte lassen ihn mehr von links, positive mehr von rechts erklingen. Erlaubte Werte liegen zwischen -100 und 100, der Wert 0 beeinflusst den Sound nicht.
Betrachten wir die media_tune Funktionen genauer; die erste Codezeile definiert die Variable tune_factor und setzt ihren Wert auf 80. Diese Variable enthält die Lautstärke des Musikstückes und wird langsam verringert. Wir verwenden musicok_handle als Handle für den Sound und lassen ihn 7 Sekunden laufen.
Die While-Schleife verringert tune_factor, bis der Wert kleiner oder gleich 0 ist, mit einer Geschwindigkeit von 0,8 * time_step. Wie Sie sehen, greift media_tune auf das Geräusch mit dem Handle musicok_handle zu, ändert die Lautstärke (den zweiten Parameter), behält aber Geschwindigkeit (100) und balance (0) bei. Dadurch verringert sich die Lautstärke langsam von 80 auf 0 und am Ende wird der Sound durch eine media_stop Anweisung angehalten.
Was können wir noch tun? Ich weiß! Drücken Sie auf die "6" und hören Sie zu, wie media_tune die Geschwindigkeit eines Sounds beeinflussen kann!
var tune_handle;
function tune_media() { tune_handle = media_loop("atmosphere.wav", NULL, 80); // play the sound as it is sleep (7); // for 7 seconds media_tune(tune_handle, 100, 70, 0); // then decrease its frequency to 70% sleep (7); // for 7 seconds media_tune(tune_handle, 100, 130, 0); // now increase its frequency to 130% sleep (7); // and play it this way for 7 seconds media_pause(tune_handle); // pause the sound sleep (2); // for 2 seconds media_start(tune_handle); // and then resume the playback }
on_6 = tune_media;
Haben Sie das gehört? Die Musik lief 7 Sekunden lang mit normaler Geschwindigkeit, dann weitere 7 Sekunden auf 70% der Geschwindigkeit und dann weitere 7 Sekunden lang auf 130%. Schließlich wurde media_pause genutzt, um den Sound anzuhalten und mit media_start wurde er 2 Sekunden später wieder gestartet. Wie Sie am obigen Code sehen, wurden die Geschwindigkeitsänderungen durch den dritten Parameter der media_tune Anweisung erwirkt.
var movie_handle;
function tune_movie() { movie_handle = media_loop("globe.avi", NULL, 80); // play this movie at its regular speed sleep (7); // for 7 seconds media_tune(movie_handle, 100, 40, 0); // now play it much slower (at 40% of its speed) sleep (7); // for 7 seconds media_tune(movie_handle, 100, 200, 0); // now play the movie faster (200% faster) sleep (7); // for 7 seconds media_pause(movie_handle); // pause the movie sleep (2); // for 2 seconds media_start(movie_handle); // and the resume the playback }
on_7 = tune_movie;
Ja, ich weiß, das ist beinahe das Gleiche, aber diese Funktion spielt einen Film erst mit normaler Geschwindigkeit, dann auf 40%, auf 200% und pausiert ihn dann für 2 Sekunden, ehe er weiterläuft - mit "7" können Sie es testen. Wie Sie wissen kann media_play nicht nur Sounds, sondern auch Videos (mit oder ohne Hintergrundgeräuschen) abspielen. Ich habe eine kleine avi Datei verwendet, aber Sie können mit dieser Anweisung auch lange Zwischensequenzen abspielen. Stellen Sie sicher, dass der Endrechner die korrekten Codecs installiert hat, falls Sie einen exotischen Codec für den Film verwendet haben.
function play_cd() { cd_play (1, 1); // play the first cd track sleep (10); // for 10 seconds cd_play (2, 2); // now play the second cd track sleep (10); // for 10 seconds cd_pause(); // pause the playback sleep (5); // for 5 seconds cd_start(); // resume playback, continues to play the second track }
on_8 = play_cd;
Die obige Funktion spielt reguläre Audio CDs ab, Sie sollten also zum Testen eine CD im Laufwerk haben. Drücken Sie "8", dann hören Sie den ersten Track für 10 Sekunden und danach den zweiten, ebenfalls für 10 Sekunden. Nach einer 5-sekündigen Pause wird der zweite Track fortgesetzt und läuft dann durch bis zum Ende.
Wie Sie vermutlich schon erraten haben, dient die cd_pause() Anweisung zum Pausieren der CD-Wiedergabe und cd_start() setzt sie fort; schauen wir uns die Syntax von cd_play genauer an:
cd_play (start_track, end_track);
Ja, das ist so einfach! Wenn der Audioteil der CD oder DVD 12 Tracks enthält (die Soundtracks des Spiels z.B.), dann könnte man diese folgendermaßen alle abspielen:
cd_play (1, 12);
Ich würde mich nicht verabschieden, ohne Ihnen die Funktion zu zeigen, die alle Sounds auf einmal stoppen kann:
function stop_all() { snd_stopall(4); // stop all the sounds media_stop (tune_handle); // stop this stream as well (if it is playing) media_stop (movie_handle); // stop this stream as well (if it is playing) }
on_0 = stop_all;
Die snd_stopall Anweisung hält alle Sounds (aber keine Streams) an. Die darauf folgende media_stop Instruktion hält ebenfalls die über tune_handle und media_handle bekannten Sounds an, wenn diese aktiv sind. Sie können natürlich noch weitere Streams mit weiteren media_stop Anweisungen unterbrechen. Das ist alles!
Falls Sie für heute noch keine Hausaufgaben haben, können Sie mit den Werten von sound_vol, midi_vol, cdaudio_vol und master_vol spielen; dies sind vordefinierte Variablen, welche die Lautstärke von Sounds, Streams, Audio CD Tracks und die allgemeine Mixer Lautstärke kontrollieren. Erweitern Sie mein Skript: fügen Sie vier Slider in einem Panel ein und verwenden Sie diese, um die Variablen im Bereich von 1 bis 100 einzustellen - das betrifft auch Sounds, die zur Zeit gespielt werden. Bis bald!
P.S.: Wenn Sie faul sind, könnn Sie auch einfach etwas wie midi_vol = 30 in die Konsole eingeben und schauen was geschieht...
|