• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Stehanimationen nacheinander abspielen?

JointVenture Resident

Aktiver Nutzer
Hi,
ich habe mehrere Stehanimationen gemacht, und möchte alle nach einander durchspielen lassen.
Die Animationen sind natürlich nicht alle gleichlang.
Ich habe mir ZHAO angeschaut, aber das ist viel zu kompliziert. Ausserdem sollen die Animationen nicht über ein hud gesteuert werden, sondern wenn mann das Objekt trägt.
Alles funktioniert, leider spielt immer nur eine Animation beim Stehen-Vorgang, und ich finde keine Script Lösung dafür.
Wie kann ich so etwas umsetzen ohne extra timer und llSleep?
 
Wenn du keinen Timer verwenden willst, dann kannst du höchstens noch llGetAnimationList in einem Loop auswerten. Das ist allerdings nicht immer zuverlässig.

Hast du keinen Timer mehr verfügbar, weil du den Event schon anders benutzt, dann muss aus dem normalen Timer-Event eben ein Intervall Timer werden, d.h. da wird einfach eine Variable im Loop von 0 bis 10 durchgezählt, und während Aktion 1 bei jedem Tick startet, läuft Aktion 2 dann eben nur jeden 10. Tick und damit entsprechend seltener. Timer an sich machen nebenbei eigentlich so gut wie keine CPU-Last. Es kommt nur darauf an, was man alles so im Timer-Event macht.

llSleep ist bei der LSL Programmierung eher oft ungeeignet, da du ja im Prinzip kein einfachers Ablaufprogramm schreibst, sondern einen endlichen Automaten programmierst, du beschreibst ja nur über die Abläufe in den Events, was das Skript bei welchen Zuständen machen soll. Kommt dann ein Event rein, während das Script schläft, dann kommt der so weit ich weiß leider trotzdem in den Event Queue, in dem bis zu 64 Events auf ihre Ausführung warten können. Und wenn das Script dann weiter läuft, dann wird der Queue eben Event für Event wieder abgearbeitet, was zu einem etwas unvorhersehbaren Verhalten führen kann.
 
.... Hast du keinen Timer mehr verfügbar, weil du den Event schon anders benutzt, dann muss aus dem normalen Timer-Event eben ein Intervall Timer werden, d.h. da wird einfach eine Variable im Loop von 0 bis 10 durchgezählt, ..
Danke das werde ich mal testen.

Könntest Du die erste Idee mit "llGetAnimationList in einem Loop" noch etwas genauer beschreiben? Und warum: "nicht immer zuverlässig"?
 
Mit llGetAnimationList kriegst du eine Liste mit den UUID der Animationen, die gerade gespielt werden. Du brauchst also nur zu wissen, welche UUID die Animationen haben, die du nacheinander durchspielen willst. Dann kannst du über ständiges Abfragen von llGetAnimationList auch rauskriegen ob eine Animation noch läuft oder nicht. Einfach die Liste, die du da kriegst, über einen while-Loop ständig mit der Liste der Animationen abgleichen, die du zeigen willst. Und eben dann was machen (z.B. neue Animation starten), wenn es keine Übereinstimmung mehr gibt und man den Loop daher verlässt.

Das Problem dabei (eher die Probleme): a) das verursacht vermutlich um Welten mehr CPU-Last als jede Timer-Lösung (weil da ständig was am Arbeiten und Abgleichen ist) und vor allem
b) das ganze ist nicht zuverlässig (bzw. läuft endlos weiter), wenn da eine looped animation läuft.

LSL ist vermutlich nicht ohne Grund als State-Machine konzipiert: sollte sich eigentlich nur dann im Script etwas tun (und mehr CPU-Last verursachen), wenn es auch einen Event gibt, der verarbeitet wird. So dass in der Zeit, in der ein Script keine Events abarbeitet, eben andere Scripte innerhalb der begrenzten Script-Zeit etwas mit der CPU machen können. Deswegen sollte man genau solche Loops mit ständigen endlosen Berechnungen/Abgleichen wenn möglich vermeiden. Die VM hat zwar eine "Bremse" für derartig CPU-Intensive Scripts, aber Last verursachen sie trotzdem.
 
Es ist nicht notwendig, die laufenden Anis abzufragen.

Ich habs dir Inworld shcon erklaert, verwende 2 strings.

string current_ani
string new_ani

dann gehe wiefolg vor:
Starte ueber einen timer einfach eine der Animationen, dann in der naechsten periode setze im new-string eine neue ani und und starte sie waerend die alte noch laeuft.
Nun beende die current_ani und sofort danach ueberschreibe die current_ani mit der new_ani und ueberschreibe den new_sting mit einer neuen ani am ende.

Das in einer sauberen schleife und es duerfte keinen LAG verursachen.

Beispiel: (So habe ich es in meiner AO gemacht)
Code:
string next_stand;
                if(!random_stand)
                {
                    NewStand++;
                    if(NewStand > StandListLength-1)
                    {
                        NewStand = 0;
                    }
                    next_stand = llList2String(MultiStand,NewStand);
                    llStartAnimation(next_stand);
                    [COLOR="#FF0000"]if(CurrentStand != "")
                    {
                        llStopAnimation(CurrentStand);
                    }[/COLOR]
                    CurrentStand = next_stand;
                 }

PS: Das rot markierte ist der Grund, warum die ein oder andere AO Fehlermeldungen ohne Animation (could not find animation '') ausgibt. Diese kleine Abfrage fehlt einfach.

(llStartAnimation(next_stand); geaendert, weil ich in der AO die SSAO befehle anstelle diesem nutze)

LG
Dae
 
Zuletzt bearbeitet:
Dein Problem ist auch nicht wirklich sauber lösbar in SL, d.h. man kann nicht direkt per Skript beliebige Animationen sauber nacheinander abspielen.

Das Problem ist leider, dass man über LSL die Länge einer Animation nicht rauskriegen kann. Und dass es looped Animations gibt, die immer weiter laufen.
Deswegen müsste man mit einem schnelleren timer eben wieder mal prüfen, ob eine bestimmte Animation (deren UUID man kennt) noch läuft und man müsste nach spätestens 60s (so lange können Animatinonen in SL höchstens sein) oder wenn die Animation beendet ist eben die nächste Animation starten. Das Problem dabei ist dann, dass es eben auch looped Animations gibt, die nur 5s dauern. Und die würden dann erst nach 12 mal spielen zur nächsten wechseln.

Man kann höchstens pauschal z.B. alle 15s (oder welche Zeit man auch immer haben möchte) eine neue Animation übergangslos an die alte Anschließen, das ist wohl das, was Daemonika in ihrem AO macht.
 

Users who are viewing this thread

Zurück
Oben Unten