Dieser Thread ist für Leute, die einfach nur in wenigen Sätzen beschreiben, was sie gerade oder in letzter Zeit an ihren Projekten gemacht haben, auf welche Probleme sie gestoßen sind und wie sie sie behoben haben oder einfach nur allgemeine Gedanken zum Thema loswerden wollen. Oder man kann sich einfach mal so richtig schön über Unzulänglichkeiten von Engines auskotzen. You decide. Quasi ein "Mini-Blog für alle". Vorrangig für MMM, aber nicht nur.
Ich fange mal an:
Letztes Wochende habe ich angefangen, Meteorhead 8 auszumisten und zu refactorn. (Fragt nicht, warum ich es schon wieder prokrastiniere am Hamstermann oder Britnard zu arbeiten.) Meinen anfänglichen Drang, mir eine TARDIS zu bauen, in der Zeit zurückzureisen, den Kopf meines 15-jährigen Ichs zu packen und mit voller Wucht gegen die Tischkante zu knallen habe ich inzwischen überwunden.
Das ganze alte GUI-Code ist inzwischen beseitigt und durch den 3.4er Code ersetzt worden, Characters, Views und Inventory wurden ausgemistet und organisiert, die ersten Räume wurden auf die neue Funktionssyntax umgestellt. Der Mädchenklo-Raum hat mir dagegen fast den letzten Nerv geraubt. Genauer ging es um die Sound-Effekte der geöffneten Wasserhähne.
PlayAmbiantSound() gibt es ja schon seit Jahren nicht mehr, also musste es weg. Aus irgendeinen hirnrissigen Grund gibt es dafür aber keinen adäquaten Ersatz. (Es gibt tatsächlich etwas, das früher einfacher war als jetzt? Ist nicht wahr.) Einen Extrabefehl gibt es nicht mehr, stattdessen hat die normale Play()-Methode einen zusätzlichen Parameter, mit dem festgelegt wird ob ein Sound nur einmal abgespielt oder immer wiederholt wird. Gestoppt wird das Ganze dann mit einem argumentlosen Stop(). Soweit so gut. Die Probleme beginnen dann, wenn ein Sound mehrmals gleichzeitig abgespielt werden muss (es gibt drei Wasserhähne, die gleichzeitig laufen können). Mann kann einen Sound mehrmals abspielen lassen, aber nicht einzeln stoppen. Stop() stopped immer alle Instanzen einer Audio-Dateien. Außerdem ist es nicht mehr möglich, einen Ursprung des Sound mit Raum festzulegen. Das muss über die AudioChannels gemacht werden.
Also müssen nun die tollen neuen AudioChannels herhalten. Drei AudioChannels deklarieren (für jeden Hahn einen), in den entsprechenden Funktionen einem Sound zuweisen (wird dann automatisch abgespielt) und anschließend in einer zusätzlichen Methode die Raumkoordinaten zuweisen. Läuft alles. Und gestoppt wird leider auch immer alles. Egal welchen AudioChannel ich stoppe, es werden immer alle drei Instanzen des Sounds gestoppt. Ein Blick in die Dokumentation bringt des Rätsels Lösung:
Stops the sound that is currently playing on this audio channel.
Na besten Dank auch. Der Ton wird gestoppt, nicht der Channel. May I ask why?
Der einzige Workaround der mir dazu einfällt, ist die entsprechende Sound-Datei einfach mehrmals zu importieren. Ja, wirklich! Um einen Ton gleichzeitig mehrmals abzuspielen, muss die Datei mehrmach vorhanden sein. Good job, AGS. Immerhin funktioniert es. Bis man den Raum nochmal betritt.
Wird der Raum verlassen, werden die Channels gestoppt. Betritt man den Raum erneut, wird überprüft ob die Wasser-Objects sichtbar sind und wenn ja, werden einfach die entsprechenden AudioChannels wird gestartet. Wer dachte, so einfach sei, irrt. Aus irgendeinem Grund wird einer der drei Sounds gestoppt, wenn man sich etwas im Raum bewegt. Welcher das ist, hängt von der Reihenfolge ab, in der sie gestartet wurden. Warum das so ist? Keine Ahnung. Meine einzige Idee ist, dass der Schritt-Sound die auf den Views von Spielcharakter liegt einen der Audio-Kanäle überschreibt. Tatsächlich tritt das Problem erst auf, sobald sich der Spieler im Raum bewegt und nicht, wenn er einfach in der Startposition stehen bleibt. Nach einigem Debuggen lässt sich feststellen, dass der Schritt-Sound wohl immer auf Channel 3 läuft, welcher sonst von einem der Wassergeräusche belegt ist. WAS IST DAS BITTE FÜR EIN KÄSE? Laut Doku hat AGS 8 Audio-Kanäle. Warum wird immer einer der drei überschrieben, die ohnehin schon belegt sind? Umgangen wird das Problem jetzt, indem die Wassergeräusche eine höhere Priorität bekommen (High statt Normal). Soweit funktioniert jetzt alles.