C.O.F.F.E.E. & Benutzerdaten

WiZdooM

Erfahrenes Mitglied
Hi

Mittlerweile komme auch ich nicht ums skripten rum und schon hab ich die ersten Fragen :)

1.) Wie kann man in einer Coffee-Expression die Benutzerdaten abgreifen ?
(Der Zugriff auf Variablenwerte soll vereinfacht werden)

2.) Ich habe folgenden Codefetzen :
var current_frame=doc->getTime()->GetFrame();
var stop_frame=400;
while(current_frame <= stop_frame){
//an der Stelle macht er was, solange die Schleife auskommentiert ist
}

Vom Programmieren in höheren Programmiersprachen bin ich es ja gewöhnt, daß es so funktionieren sollte, nur in Coffee tut er sich schwer und nichts passiert obwohl der Compiler keine Syntaxfehler findet.

Wäre klasse wenn mir jemand auf die Sprünge helfen könnte...
 
Hi!

@Benutzerdaten: Du benötigst das Objekt mit den Benutzerdaten - im Beispiel "op", als das "Trägerobjekt" - und dann kannst Du per "Drag'n'Drop" einfach das Benutzerfeld hinten dran setzen :)
Code:
main(doc,op)
{
 var benutzerdaten = op#ID_USERDATA:1;
...

@While: ...auch in "höheren Programmiersprachen" ist - wenn diesbezüglich nix mehr relevantes in der Schleife passiert - Deine Schleife eine "Endlosschleife". Die Schleife läuft ja auf EINEM Frame, d.h. current_frame ändert sich nie...
Unabhängig davon benötig GetFrame(); noch die Frames_per_second:
Code:
main(doc,op)
{
var frame = doc->GetTime()->GetFrame(doc->GetFps());
println(frame);
}

Liebe Grüße,
Mark.
 
Danke für die Tips, aber irgendwie...

@ Benutzerdaten

main (doc,op){
var benutzerdaten = op#ID_USERDATA:1;
...

führt zu : EXPRESSION ERROR! (17) Invalid description ID for object
Nehme ich statt "ID_USERDATA:1" den Namen des Benutzerdatums gibts den SyntaxError...


!?

@ While
Ja klar, Iteration muß erfolgen. Aber komischerweiße iteriert er für jedes Bild von Enfangswert bis Endwert ?

Der Code sieht so aus - ist eine Abwandlung von Bhodinuts Infinite Rotation, da das Objekt ab einem Bestimmten Zeitpunkt zum Stehen kommen soll... :

main (doc, object)
{

var current_frame = doc->GetTime()->GetFrame(doc->GetFps());
var stop_frame = object#ID_USERDATA:1;
var Ausrichtung = vector ( 0, 0, 0 );
var Rotationsachse = vector ( 0, 1, 0 );
var Rotationsgeschwindigkeit = 2.0;
var Objektrotation = Mix (Ausrichtung, Rotationsachse, doc->GetTime ( )->GetSecond ( ) * Rotationsgeschwindigkeit );

while(start_frame <= stop_frame){
start_frame++;
object->SetRotation (Objektrotation);
}
}
 
Zuletzt bearbeitet:
Hi!

...ich verstehe leider nicht wirklich, was Dein Script tun soll.
Zuallererst: getTime() != GetTime() ;)

Und dann: evtl. ein Mißverständnis, aber Du brauchst die while-Schleife doch garnicht?! ...das übernimmt doch die Timeline bzw. die Zeit für Dich?!
...Du möchtest doch nicht "pro Frame" das Objekt "Frame mal" drehen, oder?!

Wenn es also darum geht, die Drehung nur anzuwenden, wenn die "aktuelle Zeit" (current_frame) VOR der "Stop-Zeit" (stop_frame) liegt, reicht eine IF-Abfrage, "current_frame" wird mittels "Play" durchlaufen (quasi eine übergeordnete Schleife ;) ).
Code:
main (doc, object)
{
var current_frame = doc->GetTime()->GetFrame(doc->GetFps());
println(current_frame);
var stop_frame   = object#ID_USERDATA:1;
println(stop_frame->GetFrame(doc->GetFps()));
var Ausrichtung   = vector ( 0, 0, 0 );
var Rotationsachse = vector ( 0, 1, 0 );
var Rotationsgeschwindigkeit = 2.0;
var Objektrotation  = Mix (Ausrichtung, Rotationsachse, doc->GetTime ( )->GetSecond ( ) * Rotationsgeschwindigkeit );
println(Objektrotation);
if (current_frame <= stop_frame->GetFrame(doc->GetFps()) ) {
    object->SetRotation (Objektrotation);
}
}
@Benutzerdaten: ...von welchem Typ ist Dein Benutzerdatum? Wenn Du "Zeit" gewählt hast, ist "object#ID_USERDATA:1" vom Typ "Class-Base Time", d.h. Du mußt mittels "stop_frame->GetFrame(doc->GetFps())" das Frame ermitteln...

Anmerkung: "println" eignet sich wunderbar zum "Finden von Fehlern" ;)

Liebe Grüße,
Mark.
 
Was mein Skript machen soll ist schnell erklärt : Das Script soll einen Reifen so lange mit einer bestimmten Geschwindigkeit drehen, bis ein bestimmter frame erreicht ist (Vollbremsung, blockierende Reifen, kein ABS)
Ursprünglich ist das Script von Bhodinut (aka Infinte Rotation, das ein Objekt um eine Achse mit einer festen Gescwindigkeit unendlich rotieren lässt) - nur wollte ich jetzt nicht daß sich das Objekt unendlich dreht, sondern nur bis Frame X -> Also so wie du sagst die Drehung nur anwenden, wenn die "aktuelle Zeit" (current_frame) VOR der "Stop-Zeit" (stop_frame) liegt...

Die "!=" Syntax in meinem ersten Post war ein Denkfehler von mir -> der Reifen soll nicht nur an diesem einen Frame die Drehung beenden sondern ab diesem Frame.

Zu den Benutzerdaten : Ja das verwedete Format für das Datum ist Zeit. Der "Name" des Benutzerdatums lautet StopFrame...aber dennoch akzeptiert er
var stop_frame = object#ID_USERDATA:1; // ID_USERDATA wird vom Compiler rot geschrieben
nicht.

Werde dann noch ein wenig basteln...
Aber tausend Dank für die Hilfe
 
Zuletzt bearbeitet:
Hi!

Daß "ID_USERDATA" rot geschrieben wird, ist KEIN FEHLER! ...das ist einfach so :)

Somit: hast Du obiges Script mal ausprobiert?
Coffee-Tag am Würfel, Würfel mit Benutzerdatum "Zeit"...? ...und immer die Konsole im Blick?

Liebe Grüße,
Mark.
 
Hi!

Dein Coffee-Tag hat das Benutzerdatum, nicht Dein Würfel und somit auch nicht "object"...
-> weise direkt dem Würfel das Benutzerdatum "Zeit" zu... oder Du besorgst Dir im Script das dementsprechende Coffee-Tag als Objekt.

Liebe Grüße,
Mark.
 
Zurück