Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Newbies => Thema gestartet von: Scorpe am 15. Juni 2013, 21:13:51
-
In vielen Episoden, z.B. in der Schlussszene von Episode 67 sieht man wie verschiedene Charaktere durch die Gegend rennen und gleichzeitig was rufen. Wie kriegt man sowas hin? Also dass einmal die Charaktere gleichzeitig laufen und sprechen können und dass auch noch verschiedene Personen gleichzeitig (durcheinander) rufen und die verschiedenen Texte zur selben Zeit auf dem Bildschirm erscheinen. Normalerweise ist es ja so, die eine Person sagt was, der Text geht weg und danach sagt eine andere was.
-
Grundsätzlich kann man "blockende" Sachen nicht parallel laufen lassen.
Zwei Charaktere gleichzeitig laufen zu lassen, ist aber sehr einfach:
[ags] cDave.Walk(123, 456, eNoBlock);
cBerndard.Walk(456, 123, eBlock);[/ags]
Hier läuft Dave los, und wegen eNoBlock macht AGS sofort mit dem nächsten Kommando weiter. Dieses wiederum enthält eBlock, d.h. diesmal wartet AGS, bis Bernard angekommen ist. Idealerweise kommt Dave zuerst an, ansonsten schickt man halt Bernard zuerst und "nickt-blockend los".
Beim Sprechen wirds etwas komplizierter. Grundsätzlich ist LucasArts-Style-Speech ein simpler Overlay.CreateTextual(...), bei dem gleichzeitig die Figur mit der Speechview animiert wird. Das lässt sich relativ einfach faken, indem man diese Kommandos einfach selbst ausruft. Man kann SayBackground benutzten, anstatt den Overlay selbst zu erzeugen, das ist vermutlich einfacher.
Ein gleichzeitiges .Say, wie oben mit .Walk geht hier aber nicht.
Code (circa):
[ags] Overlay *temp = cDave.SayBackground("HALLO");
cDave.LockView(cDave.SpeechView);
cDave.Animate(cDave.Loop, 4, eRepeat, eNoBlock);
cBernard.Say("HALLO"); // blockendes Say, -> zwei HALLOs
// danach: aufräumen
cDave.UnlockView();
if (temp != null && temp.Valid) temp.Remove();[/ags]
-
Vielen Dank für die Hilfe, das hilft mir auf jeden Fall schon sehr viel weiter. Hatte ich mir irgendwie schon gedacht, dass das gleichzeitige Laufen und Sprechen nur "hintenrum" geht ;), aber ich werd's auf jeden Fall ausprobieren.
-
Ich habe es mal nur mit dem SayBackground und dem eNoBlock und eBlock Befehlen ausprobiert und es geht.
Ich habe es im Mansion SP ausprobiert:
[ags]cDave.EnterRoom(5, 294, 143, eDirDown);
cBernard.EnterRoom(5, 466, 143, eDirDown);
Wait(40);
player.SayBackground("Dr. Fred labert...");
cDave.SayBackground("Dave labert...");
cBernard.SayBackground("Bernie labert...");
cDave.Walk(341, 143, eNoBlock);
cBernard.Walk(414, 143, eBlock); // <-- ganz wichtig ist, das hier ein eBlock steht, sonst klappt es nicht
cDave.Walk(294, 143, eNoBlock);
cBernard.Walk(466, 143, eNoBlock);[/ags]
Dr. Fred habe ich als player ausgewählt und ihn direkt vor der Villa in die Mitte von Dave und Bernard plaziert. x = 381 und y = 143, als Startraum 5 auswählen.
Den Code habe ich in die room_AfterFadeIn() Funktion eingefügt. Wenn du dann auf Start klickst, läuft es ab und wenn du in die Villa gehst und wieder raus auch.
Jetzt laufen Bernard und Dave hin und her und alle sind gleichzeitig am reden.
Ich traue mich es kaum zu sagen, aber so erscheint es mir einfacher als von KhrisMUC gezeigt. Oder ist meine Lösung nicht das was du gesucht hast? Wenn du jetzt noch mehr Leute hast, musst du immer an der passenden Stelle beim Walk den eBlock-Parameter benutzen, sonst klappt es nicht. Einfach mal ausprobieren.
@KhrisMUC
Wenn ich gerade Unsinn gepostet habe(und deine Lösung doch besser ist), bitte ich um Gnade. ;D
-
Das ist genau das was ich gesucht habe! Cool, damit komme ich auf jeden Fall weiter, vielen Dank! Mehr als drei Leute wollte ich auch nicht rumrennen und labern lassen, das gäbe dann doch zuviel Durcheinander ;).
-
Freut mich wenn ich helfen konnte ... :)
-
Ich habe beschrieben, wie man gleichzeitiges animiertes, blockendes Sprechen erzeugt. Ist also nicht ganz das Gleiche.
Hab aber gerade gesehen, dass Scorpe eher nach Laufen+Sprechen gleichzeitig gefragt hat, nicht nach gleichzeitigem Laufen und separat nach gleichzeitigem Sprechen :)