LockView Script-Problem

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Okami Joe
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 13
Registriert: 28.01.2007, 13:53
Kontaktdaten:

LockView Script-Problem

Beitrag von Okami Joe »

Ich versuche gerade im Skript-Editor alles so zu deichseln, dass mein Charakter seinen Gesichtsausdruck ändert während er spricht.
In diesem Beispiel klicke ich mit dem Talk-to Symbol auf meine Figur, und bei jeder Textpassage zieht er eine Grimasse. Das alles funktioniert zwar wunderbar, aber es gibt einen kleinen Fehler darin was mich stört: Wenn ich klicke, läuft zuerst die Animationphase 1x durch, bevor der Text angezeigt wird, kann man das irgendwie ändern damit das alles gleichzeitig passiert?
Die Zeilenreihenfolge im Editor zu ändern hilft nicht...
Hier mein Skript:

cIch.LockView(5);
cIch.Animate(2, 6, eOnce, eBlock, eForwards);
cIch.Say("Hi, wie geht es mir?");
cIch.UnlockView();
cIch.LockView(5);
cIch.Animate(1, 6, eOnce, eBlock, eForwards);
cIch.Say("Ganz gut, aber ich bin etwas beunruhigt wegen der Tatsache, dass ich grade mit mir selbst quatsche.");
cIch.UnlockView();

Danke im Voraus!
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du musst die SpeechView verändern:

Code: Alles auswählen

int alt=cIch.SpeechView;
cIch.SpeechView=5;  
cIch.Say("bla");
cIch.SpeechView=alt;  // SpeechView auf alten Wert setzen
Und natürlich musst Du nicht

Code: Alles auswählen

cIch.UnlockView();
cIch.LockView(5);
zwischendrin benutzen.

Du kannst Dir auch eine Funktion schreiben:

An den Start vom global script:

Code: Alles auswählen

function Grimasse(String text) {
  int alt=cIch.SpeechView;
  cIch.SpeechView=5;  //  x ist die Nummer der Grimassenview
  cIch.Say(text);
  cIch.SpeechView=alt;
}

export Grimasse;
In den Script Header:

Code: Alles auswählen

import function Grimasse(String text);
Und jetzt im Skript nur noch:

Code: Alles auswählen

Grimasse("Hi, wie geht es mir?");
Grimasse("Ganz gut, aber ich bin etwas beunruhigt wegen der Tatsache, dass ich grade mit mir selbst quatsche.");
Use gopher repellent on funny little man
Okami Joe
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 13
Registriert: 28.01.2007, 13:53
Kontaktdaten:

Beitrag von Okami Joe »

Danke für die Antwort!
Ich hab den Code ausprobiert aber irgendwas scheint da nicht zu klappen...
Also wenn ich deinen Code richtig verstehe, dann ändert sich der Gesichtsausdruck durch den Wechsel der Views, aber ich finde hier keine Option um den entsprechenden Loop auszuwählen wo sich meine Grimassen befinden. Ich hab das nämlich so eingerichtet:

View=5, Loop=0 ist meine normale Sprechanimation
View=5, Loop=1 ist die fröhliche Sprechanimation
View=5, Loop=2 ist die traurige Sprechanimation

In diesem Ereignis benutze ich Loop=1 für den ersten Satz:
("Hi, wie geht es mir?")
und dann folgt der Wechsel auf Loop=2 für den Zweiten:
("Ganz gut, aber ich bin etwas beunruhigt wegen der Tatsache, dass ich grade mit mir selbst quatsche.")

Loop=0 brauche ich in dem Fall nicht.
Kann man mit Speechview keine Loops angeben, oder geht das so nicht?
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Speech-Views haben ebenso wie die Laufanimationen eine Richtung. Loop 0 nach unten, Loop 1 nach links, Loop 2 nach rechts und Loop 3 nach oben. Daher wäre es sinnlos beim festlegen eines speech views einen loop mit festzulegen.
Du kannst das ganze über eine Animation machen, wie du es ja versucht hast. Dadurch sparrst du dir einen View. Allerdings brauchst du ja so oder so einen loop für jede Richtung (oder soll sich der cha immer nach vorne (oder links, rechts, oben) drehen, wenn er mit sich selbst spricht (darum geht es ja hier).
Die Lösung von Khris ist im Großen und Ganzen das, was du möchtest, allerdings muss es wohl für deinen Zweck etwas verändert werden:

Am besten schreibst du eine kurze Funktion für jeden "besonderen" Speech-View, also Grimasse, traurig, eventuelle weitere, wenn du denn welche hast.

Code: Alles auswählen

function Grimasse(String text) {
  int alt=cIch.SpeechView;
  cIch.SpeechView=a;  //  a ist die Nummer der Grimassenview
  cIch.Say(text);
  cIch.SpeechView=alt;
}

export Grimasse;

Code: Alles auswählen

function traurig(String text) {
  int alt=cIch.SpeechView;
  cIch.SpeechView=b;  //  b ist die Nummer der traurig-View
  cIch.Say(text);
  cIch.SpeechView=alt;
}

export traurig;
Du siehst, die Struktur ist immer die gleiche.
Für deine spezielle Situation schreibst du dann:

Code: Alles auswählen

Grimasse("Hi, wie geht es mir?");
traurig("Ganz gut, aber ich bin etwas beunruhigt wegen der Tatsache, dass ich grade mit mir selbst quatsche.");
Wenn du das ganze nur an einer Stelle brauchst lohnt es sich natürlich nicht dafür extra eine function zu schreiben. Es ginge auch, das ganze in eine einzelne Funktion zu packen, das wird ein wenig einfacher:

Code: Alles auswählen

function sprechen (string text, int wie) {
cIch.SpeechView=wie;  //hier musst du aufpassen, das du später immer den Wert beim Aufruf der function eingibst, den der gesuchte View hat
cIch.Say(text);
}
export sprechen;
Bei dieser Methode ist es nicht notwendig den View wieder auf den "normalen" Speech View zurückzusetzen, allerdings nur, wenn du jedes Mal, wenn der Cha spricht dies über sprechen aufrufst.
Egal welche functions du schreibst, du musst es natürlich im Script Header importieren.


Bei der Methode brauchst du aber wie gesagt für jeden Speech-View einen einzelnen View. Über Loops kannst du es nicht machen.
Solltest du es dennoch nur über einen View und mehrere Loops machen wollen (wie gesagt nicht unbedingt logisch, weil es verschiedene Richtungen gibt), dann müsstest du es über Character.Animate(int loop, int delay, optional RepeatStyle, optional BlockingStyle, optional Direction), aber das fände ich unnötig kompliziert und erkläre es deshalb erstmal auch nicht.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Okami Joe
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 13
Registriert: 28.01.2007, 13:53
Kontaktdaten:

Beitrag von Okami Joe »

Vielen Dank, funktioniert jetzt einwandfrei! :wink:
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Wenn Du es noch "optimierter" haben willst, benutz einen enum.

Im script header:

Code: Alles auswählen

enum Stimmung {
  Grimasse,
  Traurig,
  Froehlich
};

import function sprechen(String text, Stimmung s);
global script:

Code: Alles auswählen

function sprechen(String text, Stimmung s) {
  if (s==Grimasse) cIch.SpeechView=x;
  if (s==Traurig) cIch.SpeechView=y;
  if (s==Froehlich) cIch.SpeechView=z;
  ...
}

export sprechen;
Dann im Skript:

Code: Alles auswählen

sprechen("Was soll der Mist?", Grimasse);
sprechen("Na egal, ich schaff das schon!", Froehlich);
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 »

schöne Idee mit den Gesichtsausdrücken :D =D>
Danke, Adventuretreff! <3
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

khris, ich will ja nix sagen, aber sehr optimiert ist das nicht gerade. Du musst sehr viel mehr Zeilen schreiben. Gut, bei meiner Methode muss man immer daran denken, welcher View welchen Gesichtsausdruck meint, aber bei dir muss man einiges mehr an Script-Zeilen schreiben, dafür beim Aufrufen der Funktion weniger denken.
Im Endeffekt wahrscheinlich einfach mal wieder Geschmackssache :lol:
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hmm, kommt wohl drauf an, was man unter "optimiert" versteht.
Den enum kann man auch so definieren:

Code: Alles auswählen

enum Stimmung { Grimasse, Traurig, Froehlich };
Also hat meine Version gerade mal (Anzahl der Stimmungen) mehr Zeilen als Deine. 3 oder 4, in etwa?

Wären jetzt 50 Zeilen oder ein extra Modul notwenig, ok, aber die Erleichterung, von AGS beim Tippen eine Auswahl der Stimmungen angezeigt zu bekommen und sich keine Nummern merken zu müssen, wiegt die paar Extrazeilen IMO mehr als auf.

Soll Okami Joe entscheiden, was ihm lieber ist; ich wollte nur die zweite Möglichkeit zeigen, nicht Deine Version schlecht machen.
Use gopher repellent on funny little man
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Soll Okami Joe entscheiden, was ihm lieber ist; ich wollte nur die zweite Möglichkeit zeigen, nicht Deine Version schlecht machen.
Das versteht sich von selbst O:) Am besten macht es jeder wie er will.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Antworten