LockView Script-Problem
-
- Komplettlösungsnutzer
- Beiträge: 13
- Registriert: 28.01.2007, 13:53
- Kontaktdaten:
LockView Script-Problem
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!
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!
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Du musst die SpeechView verändern:
Und natürlich musst Du nichtzwischendrin benutzen.
Du kannst Dir auch eine Funktion schreiben:
An den Start vom global script:
In den Script Header:
Und jetzt im Skript nur noch:
Code: Alles auswählen
int alt=cIch.SpeechView;
cIch.SpeechView=5;
cIch.Say("bla");
cIch.SpeechView=alt; // SpeechView auf alten Wert setzen
Code: Alles auswählen
cIch.UnlockView();
cIch.LockView(5);
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;
Code: Alles auswählen
import function Grimasse(String text);
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
-
- Komplettlösungsnutzer
- Beiträge: 13
- Registriert: 28.01.2007, 13:53
- Kontaktdaten:
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?
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?
- Sinitrena
- Tastatursteuerer
- Beiträge: 678
- Registriert: 08.05.2004, 01:01
- Wohnort: Frankfurt
- Kontaktdaten:
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.
Du siehst, die Struktur ist immer die gleiche.
Für deine spezielle Situation schreibst du dann:
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:
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.
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;
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.");
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;
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"
-
- Komplettlösungsnutzer
- Beiträge: 13
- Registriert: 28.01.2007, 13:53
- Kontaktdaten:
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Wenn Du es noch "optimierter" haben willst, benutz einen enum.
Im script header:
global script:
Dann im Skript:
Im script header:
Code: Alles auswählen
enum Stimmung {
Grimasse,
Traurig,
Froehlich
};
import function sprechen(String text, Stimmung s);
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;
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
- DieFüchsin
- Adventure-Gott
- Beiträge: 4406
- Registriert: 12.03.2004, 16:55
- Sinitrena
- Tastatursteuerer
- Beiträge: 678
- Registriert: 08.05.2004, 01:01
- Wohnort: Frankfurt
- Kontaktdaten:
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
Im Endeffekt wahrscheinlich einfach mal wieder Geschmackssache
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"
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Hmm, kommt wohl drauf an, was man unter "optimiert" versteht.
Den enum kann man auch so definieren:
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.
Den enum kann man auch so definieren:
Code: Alles auswählen
enum Stimmung { Grimasse, Traurig, Froehlich };
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
- Sinitrena
- Tastatursteuerer
- Beiträge: 678
- Registriert: 08.05.2004, 01:01
- Wohnort: Frankfurt
- Kontaktdaten:
Das versteht sich von selbst Am besten macht es jeder wie er will.Soll Okami Joe entscheiden, was ihm lieber ist; ich wollte nur die zweite Möglichkeit zeigen, nicht Deine Version schlecht machen.
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"