Making The Game – Teil 13: Das Soundmanagement

audio

Die Tongestaltung hat einen großen Anteil an der Gesamtwirkung von Spielen. So kann die passende Musik und ein richtig platzierter Sound-Effekt unterbewusst zur aktuellen Situation beitragen und je nach Bedarf Zeitdruck auf den Spieler ausüben oder eine ruhige Spielphase untermalen. Dabei entfaltet sich häufig erst die gewünschte Wirkung im Zusammenspiel von Bild und Ton.
 
Neben dem Moderator der Anwendung, der nur auf auditive Weise in Erscheinung tritt, werden auf der akustischen Ebene Effekte, zum Beispiel für das richtige Beantworten einer Frage, sowie verschiedene Musikstücke abgespielt.
 
Damit diese gleichzeitig ablaufen, aber dennoch einzeln steuerbar sind, werden Musik, Soundeffekte und Sprache auf jeweils einem separaten Audio-Kanal abgespielt.
Durch das Verwenden von Kanälen kann darüber hinaus sichergestellt werden, dass immer nur eine Tondatei pro Kanal abgespielt wird. Ohne diese Zuweisung könne es sonst zu einer Überlagerung von verschiedenen Effekten oder gesprochenen Sätzen kommen, was dazu führt, dass diese nicht mehr verständlich wären.
 

  1.  var musicChannel:SoundChannel = new SoundChannel();     // music
  2.  var speakerChannel:SoundChannel = new SoundChannel();   // moderator
  3.  var effectsChannel:SoundChannel = new SoundChannel();   // effects

 
Um auch nach mehrmaligem Spielen Abwechslung für den Spieler zu schaffen, werden verschiedene Varianten von gleichen Texten eingesprochen. Dadurch wirkt das Spiel lebendiger und realitätsnäher, als wenn nur ein Standardtext ständig wiederholt werden würden.
 

    —– Spielerauswahl —–
    * Auswahl zwischen 1, 2 und 3 Spielern *
     
    —– erste Runde —–
    1) Wie viele Spieler haben wir denn heute?
    2) Okay, ich gebe es zu… ich kann nicht Zählen… *seuftz* könnt ihr mir einfach sagen zu wievielt ihr diese Runde spielen wollt?
    3) Also dann mal durchzählen eins, zwei, fünf, Würfel, drei, Ziege…ähm… ach sagt mir einfach selbst wie viele Spieler wir heute haben.
    4) Wie viele mutige Kandidaten wollen denn heute antreten?
    5) Jetzt müsst ihr mir nur noch sagen wie viele Spieler wir heute haben.
    6) Zu wievielt sind wir denn heute?
    7) Wie viele Kandidaten wollen denn in dieser Runde unter Beweis stellen was sie können?

 
Der hier gezeigte Text ist ein Auszug aus dem Audio-Script der Assistentin, welche die Spieler durch das Menü führt. Es zeigt verschiedene Versionen, wie die Benutzer bei der Spielerauswahl nach dem erstmaligen Starten des Spieles aufgefordert werden, die Anzahl der Mitspieler auszuwählen.
Die entsprechenden Pfade der einzelnen Audio-Dateien sind in einer gesonderten XML-Datei hinterlegt. Dabei werden die jeweils zusammengehörigen Dateien in Kategorien zusammengefasst.
 
Bevor ein Satz aus der gewünschten Kategorie abgespielt wird, muss zuerst einer gewählt werden. Die dafür entwickelten Funktionen differenzieren dabei, ob der Spieler bereits vorher schon an dieser Stelle des Spiels war oder ob er eine einleitende Erklärung zur aktuellen Auswahl benötigt. Ist dies geklärt, wird die Anzahl der möglichen Audio-Dateien aus der XML-Datei ausgelesen und per Zufallsfunktion eine ausgewählt, deren Pfad zurückgegeben wird.
 

  1.  function getPath():String{
  2.     var getFile:String;
  3.     var lngth:int;
  4.     var rnd:int;
  5.    
  6.     if(roundsPlayed == 0){  // if no round has been played
  7.         // get number of audio files
  8.         lngth = basicXMLGeneralAudio.MENUE.PLAYERSELECT.
  9.                 FIRST.ITEM.(@name==„play“).length();
  10.  
  11.         rnd = randomNumber(1,lngth);
  12.  
  13.         // get path of the selected audio file
  14.         getFile = basicXMLGeneralAudio.MENUE.PLAYERSELECT.
  15.             FIRST.ITEM.(@name==„play“)[rnd1];
  16.    
  17.     } else {
  18.         if(playerSelected==1){
  19.         // …
  20.     }
  21.     return getFile;
  22.  }
  23.  

 
Der zurückgelieferte Pfad der Audio-Datei wird danach an die Soundmanagement-Klasse mit dem Aufruf der callAudio()-Funktion übertragen. Für den Effekt- und Musik-Kanal existieren ähnlich aufgebaute Funktionen, die hier jedoch nicht im Detail beschrieben werden.
 
Die Funktion prüft im ersten Schritt, ob momentan ein Satz von der Assistentin oder dem Moderator abgespielt wird. Ist dies der Fall, wird die Ausgabe des alten Satzes abgebrochen, da wir annehmen, dass der Aufruf der neuen Audio-Datei durch die Interaktion mit dem Spieler zustande kam und dieser ein sofortiges Feedback zu seiner durchgeführten Aktion erhalten soll.
Danach wird die abzuspielende Datei geladen und auf dem entsprechenden Ausgabekanal abgespielt. Dabei erfolgt erneut die Zuweisung der vom Benutzer eingestellten Lautstärke, da diese beim Abspielen neuer Ton-Dateien in wenigen Fällen von Flash zurückgesetzt wird.
 
Neben dem Pfad der abzuspielenden Datei können darüber hinaus auch Namen von Funktionen an die callAudio()-Funktion übergeben werden. Diese werden nach dem Abspielen der Audio-Datei automatisch aufgerufen. Es kann dabei ebenfalls festgelegt werden, ob eine Verzögerung zwischen dem Abspielende der Ton-Datei und dem Funktionsaufruf stattfinden soll.
 
Durch diese Möglichkeit können mehrere Audiodateien in Folge abgespielt werden, ohne dass diese sich überlagern.
 

  1.  function callAudio(whoToCall:String, delay:int<=0,
  2.                      whoToCallAfter:String=„voidme“):void{
  3.  
  4.     if(useAudio){
  5.         if(debugMe){ trace(„…play audio: „ + whoToCall); }
  6.        
  7.         if(audioEnabled){
  8.             speakerChannel.stop();
  9.         }
  10.        
  11.         delay = delay;
  12.         var urlString:String = pathAudio + basicLang + „/“ + whoToCall;
  13.        
  14.         soundURL = new URLRequest(urlString);
  15.         mySpeaker = new Sound();
  16.         mySpeaker.load(soundURL);
  17.         callMeLater = whoToCallAfter;
  18.        
  19.         speakerChannel = mySpeaker.play(0, 1);
  20.        
  21.         audioEnabled=true;
  22.         if(delay==0){
  23.             speakerChannel.addEventListener(Event.SOUND_COMPLETE,
  24.                                              tutSoundDone);
  25.         } else {
  26.             speakerChannel.addEventListener(Event.SOUND_COMPLETE,
  27.                                              tutSoundDone_withDelay);
  28.         }
  29.        
  30.     } else {
  31.         // no audio is used
  32.         if(debugMe){ trace(„…skip audio“); }
  33.         this[whoToCallAfter]();
  34.         audioEnabled=false;
  35.        
  36.     }
  37.  }
  38.  
  39.  function tutSoundDone(e:<Event){
  40.     audioEnabled=false; this[callMeLater]();
  41.  }
  42.  
  43.  function tutSoundDone_withDelay(e:Event){
  44.     audioEnabled=false;
  45.     delayInterval = setInterval(delayCall, (delay*1000));
  46.  }
  47.  
  48.  function delayCall():void{
  49.     clearInterval(delayInterval);
  50.     this[callMeLater]();  
  51.  }
  52.  
  53.  function voidme():void{ }
  54.  

 
 
 

Kommende Blogeinträge
Making The Game – Teil 14: Wissensbasis und Fragenauswahl / Arbeiten mit XML
Making The Game – Teil 15: Spielablauf und Spielphasen
Making The Game – Teil 16: Mini-Spiele
Making The Game – Teil 17: Evaluation und Einsatz der Anwendung
Making The Game – Teil 18: Konzept zum schulischen Einsatz und Ausblick

 
 
 

Schreibe einen Kommentar