SayBackground / Sprachanimation

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Tomatensuppe1
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 16
Registriert: 15.05.2007, 19:32

SayBackground / Sprachanimation

Beitrag von Tomatensuppe1 »

Ich habe einen Wunsch. Wer erklärt mir SayBackground mit gleichzeitiger Sprechanimation ? Vielen Dank.

Habe eine schmale Region gemalt. Wenn Charakter drüber geht, soll der Verkäufer im Hintergrund jedes mal etwas anderes sagen. Das macht er. Aber er bewegt die Lippen nicht.
In der AGS Hilfe steht drin:
SayBackground: Note that the character's talking animation is not played if this function is used.

Mein Script: 2.72

// script for Region 1: Player walks onto region
if (Lucas1 == 0) {
cLucas.SayBackground("Herzlich Willkommen");
// DisplaySpeechBackground (LUCAS, "Herzlich Willkommen");
}
if (Lucas1 == 1) {
cLucas.SayBackground("Haben Sie einen Wunsch ?");
}
if (Lucas1 == 2) {
cLucas.SayBackground("Heute haben wir Cola im Angebot.");
}
if (Lucas1 == 3) {
cLucas.SayBackground("Kann ich behilflich sein ?");
}
if (Lucas1 < 3) {
Lucas1 += 1;
}
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Die Sprechanimation muss als Parameter eNoBlock haben und gleichzeitig mit dem Satz gestartet werden.

Zusätzlich musst Du den Overlay speichern und überprüfen, wann er abgeschaltet wird.

Also:

Code: Alles auswählen

Overlay*o;  // globale Variable!

// global script, repeatedly_execute
  if (cLucas.Animating && !o.IsValid) cLucas.UnlockView();

// room script, player walks onto region
  String s;
  if (Lucas1==0) s="Herzlich Willkommen";
  if (Lucas1==1) s="Haben Sie einen Wunsch?";
  if (Lucas1==2) s="Heute haben wir Cola im Angebot.";
  if (Lucas1==3) s="Kann ich behilflich sein?";
  if (Lucas1<3) Lucas1++;

  o=cLucas.SayBackground(s);
  cLucas.LockView(cLucas.SpeechView);
  cLucas.Animate(cLucas.Loop, 5, eRepeat, eNoBlock);
Nicht getestet!
Use gopher repellent on funny little man
Tomatensuppe1
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 16
Registriert: 15.05.2007, 19:32

Beitrag von Tomatensuppe1 »

@KhrisMUC vielen Dank. Aber wie immer es geht nicht. Du musst noch mal ran :-)
Fehlermeldung: Error Global Script undefined symbol "o"

Overlay*o; // globale Variable!
Habe ich in das room script file gemacht ?
// room script file
int Lucas1;
Overlay*o;
#sectionstart region1_a // DO NOT EDIT OR REMOVE THIS LINE

Im Global script habe ich reingesetzt ?
// global script, repeatedly_execute
function repeatedly_execute (){

DisplaySpeechQ_RE(); // place it before any other script code in rep. exec.
if (cLucas.Animating && !o.IsValid) cLucas.UnlockView();
if (IsGamePaused () != 1)
{
CheckTimers ();
// --- for the MovePlayer function ---....

Und der Rest ist normal im // room script, player walks onto region

Kannst du bitte den Code noch etwas genauer erklären ?
Was macht String s; ?

Und das hier: cLucas.Animate(cLucas.Loop, 5, eRepeat, eNoBlock);
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ok, der Reihe nach:

Der Overlay o muss als globale Variable deklariert werden (damit er auch für die rep_ex existiert).

Code: Alles auswählen

// global script, Anfang
Overlay*o;
export o;

// script header
import Overlay*o;
String s; deklariert eine Variable vom Typ String; in s speichere ich den Satz, damit nicht viermal im Code "cLucas.SayBackground" steht. Ist reine Geschmackssache, ich finds übersichtlicher so.

Der Animate-Befehl ist in der Hilfe gut erklärt.
-cLucas.Loop stellt sicher, dass der Charakter beim Sprechen in die richtige Richtung schaut
-5 ist die Geschwindigkeit: alle 5/40 Sekunden nächstes Frame
-eRepeat: Animation läuft kontinuierlich
-eNoBlock: im Hintergrund
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Im AGS-Forum hat jemand ein Modul dafür geschrieben, hier der Link zum Code.
Danke, Adventuretreff! <3
Tomatensuppe1
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 16
Registriert: 15.05.2007, 19:32

Beitrag von Tomatensuppe1 »

Danke. Aber ich komme nicht weiter.
Habe mich erstmal an KhrisMUC gehalten.

Benutze ich das "o" kommt folgende Fehlermeldung:
Das die Variable im Starterpaket schon definiert ist.
(int o =GetObjectAT(mouse....

Ersetze ich das "o" mit etwas anderem z.B. AB oder 33 dann kommt Fehlermeldung
"is Valid is not a public member of overlay"

Hab es hoffentlich genauso gemacht. Bitte schön ausführlich.
// global script, Anfang
Overlay*o;
export o;

// global script, repeatedly_execute
if (cLucas.Animating && !o.IsValid) cLucas.UnlockView();

// script header
import Overlay*o;

// room script, player walks onto region
String s;
if (Lucas1==0) s="Herzlich Willkommen";
if (Lucas1==1) s="Haben Sie einen Wunsch?";
if (Lucas1==2) s="Heute haben wir Cola im Angebot.";
if (Lucas1==3) s="Kann ich behilflich sein?";
if (Lucas1<3) Lucas1++;

o=cLucas.SayBackground(s);
cLucas.LockView(cLucas.SpeechView);
cLucas.Animate(cLucas.Loop, 5, eRepeat, eNoBlock);
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du musst das o schon überall ersetzen. Und ich wusste natürlich nicht, dass Du ein MMM-Pack benutzt.

Variablennamen dürfen nicht nur aus Ziffern bestehen, 33 geht also auf keinen Fall. AB sollte gehen. Groß- und Kleinschreibung ist wichtig; die Variable ab ist eine andere als Ab, aB und AB.

Und es heißt nicht ".IsValid" sondern nur ".Valid", sorry. Dann sollte es gehen, habs getestet.
Use gopher repellent on funny little man
Tomatensuppe1
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 16
Registriert: 15.05.2007, 19:32

Beitrag von Tomatensuppe1 »

@KhrisMUC
Wer schreibt so spät bei Nacht und Wind?
Das ist der KhrisMUC ganz geschwind.
Er hat die Maus wohl in der Hand
Er faßt sie sicher ganz am Rand.


KhrisMUC, KhrisMUC, und hörest du nicht,
Was der Verkäufer leise spricht? :lol:


So und hier für alle die Zusammenfassung von Susi.

Ein Person die im Hintergrund verschiedene Sätze sagt wenn man(n) über eine Region läuft. AB=Globale Variable, Lucas= Name laut Char-Liste, Lucas1=Integer in Roomscript.

// global script, Anfang
Overlay*AB;
export AB;

// global script, repeatedly_execute
if (cLucas.Animating && !AB.Valid) cLucas.UnlockView();

// script header
import Overlay*AB;

// room script, player walks onto region
String s;
if (Lucas1==0) s="Herzlich Willkommen";
if (Lucas1==1) s="Haben Sie einen Wunsch?";
if (Lucas1==2) s="Heute haben wir Cola im Angebot.";
if (Lucas1==3) s="Kann ich behilflich sein?";
if (Lucas1<3) Lucas1++;

AB=cLucas.SayBackground(s);
cLucas.LockView(cLucas.SpeechView);
cLucas.Animate(cLucas.Loop, 5, eRepeat, eNoBlock);
Antworten