AGS 2.72? Oder schon 3.0? (Immer dazu sagen, da viele noch nicht umgestiegen sind und der Editor bei 3.0 deutlich anders ist.)
Es gibt schon die Möglichkeit, sowas automatisch zu machen.
Angenommen, Du willst z.B., dass der Charakter beim Benutzen/Nehmen immer zu dem Gegenstand hinläuft und danach greift, und hast drei Animationen, je nachdem, ob er hoch, vor oder zum Boden greifen soll.
-Als Erstes musst Du ein paar Custom Properties hinzufügen. Wähle irgendeinen Hotspot oder irgendein Object aus, click auf den "Custom Properties"-Button/bei Properties auf (...) und dann auf "Edit schema".
Du brauchst: X- und Y-Koordinate (nur für Objekte), Richtung, in die er schaut, und Greifhöhe.
Bei letzterem z.B.: Name: "reach", Description: "Griffhöhe", Type: Number, Default value: 0.
(X/Y-Koordinate: "x"/"y", "X/Y-Koordinate", Number, 160/100
Richtung: "face", "Blickrichtung", Number, -1)
Dann schließ das Fenster wieder.
Du kannst jetzt jedem Object, jedem Hotspot und jedem Character Koordinaten, Richtung und Griffhöhe zuweisen, indem Du bei den Properties die Zahlen einträgst, z.B. bei Griffhöhe: 0=nix, 1=Boden, 2=vor, 3=hoch.
-Als nächstes schreiben wir an den Anfang des global scripts (GlobalScript.asc) eine Funktion:
Code: Alles auswählen
function WalkFaceReach(int mx, int my) {
int lt=GetLocationType(mx, my);
int rt;
int fc=-1;
// hinlaufen
if (lt==eLocationHotspot) {
Hotspot*h=Hotspot.GetAtScreenXY(mx, my);
rt=h.GetProperty("reach");
fc=h.GetProperty("face");
player.Walk(h.WalkToX, h.WalkToY, eBlock); // bei Hotspots den WalkTo-Point benutzen
}
else if (lt==eLocationObject) {
Object*o=Object.GetAtScreenXY(mx, my);
rt=o.GetProperty("reach");
fc=o.GetProperty("face");
player.Walk(o.GetProperty("x"), o.GetProperty("y"), eBlock);
}
else if (lt==eLocationCharacter) {
Character*c=Character.GetAtScreenXY(mx, my);
fc=c.GetProperty("face");
player.Walk(c.GetProperty("x"), c.GetProperty("y"), eBlock);
}
// in die Richtung schauen
int x=player.x;
int y=player.y;
if (fc==0 || fc==3) y-=fc*2-3;
if (fc==1 || fc==2) x+=fc*4-6;
if (fc!=-1) player.FaceLocation(x, y, eBlock);
// greifen
if (rt==0 || lt==eLocationCharacter) return; // nicht greifen bei 0 oder Charakter
player.LockView(rt+5); // VIEWs Nr. 6, 7, 8 für Boden, vor, hoch
player.Animate(player.Loop, 3, eOnce);
Wait(4);
player.UnlockView();
}
-Jetzt runterscrollen zu on_mouse_click. Bei einem Linksklick wird üblicherweise einfach ProcessClick ausgeführt.
Direkt davor kommt Folgendes rein:
Code: Alles auswählen
if (mouse.Mode==eModeInteract || mouse.Mode==eModeUseInv) {
WalkFaceReach(mouse.x, mouse.y);