Das Zweite Leben


Deutsche Community rund um Second Life™
Online im Chat
Keine User im Chat online
Folge uns auf Twitter!

Wir baun uns eine Uhr - Turtorial

Du kannst etwas, was andere wahrscheinlich nicht können? Oder Du hast etwas herausgefunden, was schon oft gefragt wurde? Stelle es hier rein und erkläre es ausführlich.

Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Jenni Eales » Mo 16. Mär 2009, 09:54

Hallo zusammen,

heute möchte ich wieder mit einer kleinen Tutorial-Serie beginnen. Thema ist der Bau einer analogen Uhr. In kleinen Schritten wollen wir uns mit den dafür erforderlichen Scripten beschäftigen. Dazu gehören Zeitumrechnungen und ein bisschen Geometrie. Und ein bisschen drumrum natürlich, um ein bisschen Komfort zu haben.

Das Bauen gehört natürlich auch dazu. Das werd ich ebenso in einzelnen Schritten beschreiben. Am Ende bekommt jeder natürlich die Scripte und ne Kiste mit zwei "full perm" Uhren zum selber gestalten (oder für euren ersten eigenen Uhren-Laden).

So, los gehts. Als erstes schaun wir mal an, wie wir in Linden Script die aktuelle Uhrzeit ermitteln.

Richtig - es gibt einen Befehl llGetGMTclock(), die uns einen float-Wert der aktuellen Zeit liefert. Ähnlich arbeitet die Funktion llGetWallclock, die uns SL-Zeit liefert.

Hier ein link mit einem ersten Code-Beispiel: http://wiki.secondlife.com/wiki/LlGetGMTclock

Aus diesem float-Wert müssen wir nun als erstes die Stunden, Minuten und Sekunden errechnen. Das machen wir mit dem folgenden Stück Code:

Code: Alles auswählen
integer ft = (integer) llGetGMTclock();
integer hours = llFloor(ft / 3600);
integer minutes = llFloor((ft - (hours*3600)) / 60.0);
integer seconds = llFloor(ft) % 60;


Es gibt Leute, die alle Konstanten als Variablen definieren und dann nur noch diese im Code verwenden. hat den Vorteil, dass man sie schnell mal ändert, wenn sich etwas ändert. Ich vermute aber, dass die Anzahl Sekunden pro Stunde nicht so oft geändert wird, also lassen wir die Zahlen hier einfach stehen.

Diese Berechnung wollen wir gleich erweitern und auch die Zeitzone berücksichtigen. Die Zeitdifferenz zur GMT in Stunden wird später über ein Menü ausgewählt.

Code: Alles auswählen
integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
integer hours = llFloor(ft / 3600);
integer minutes = llFloor((ft - (hours*3600)) / 60.0);
integer seconds = llFloor(ft) % 60;


Die Variable vIntLocalOffset enthält die Zeitdifferenz gegenüber GMT:
+1 für MEZ
-8 für SL time
und so weiter.

Damit können wir uns nun Funktionen schreiben, die uns später die Werte für Stunden, Minuten und Sekunden errechnen und aus denen wir dann den Winkel der Zeiger berechnen. Aber eins nach dem anderen.

Code: Alles auswählen
integer getHours(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);

    return hours;
}

integer getMinutes(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);
    integer minutes = llFloor((ft - (hours*3600)) / 60.0);

    return minutes;
}

integer getSeconds(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer seconds = llFloor(ft) % 60;

    return seconds;
}


Diese Funktionen bekommen als Parameter jeweils die Zeitdifferenz in Stunden. Na ja, die Formeln sind komplizierter, als sie sein müssten, schließlich sind die Minuten und Sekunden in allen Zeitzonen gleich.

Das war's für heute. In der nächsten Lektion werden wir dann diese Funktionen in die Scripte für die einzelnen Zeiger einbauen.

Viel Spaß,
eure Jenni
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Criz Collins » Mo 16. Mär 2009, 10:01

Boooo bist du fies! :zunge:


Das Tutorial wollte ich demnächst auch machen... *fg*

Ne, klasse! Tolle Sache! Dann überleg ich mir mal was anderes.... ;)
Das ZweitesLeben.net auf Twitter: Folge @ZweitesLeben


Achja, übrigens... Auch DU kannst Werbung für ZL machen! Einfach hier und dort mal eine Bemerkung ingame fallen lassen, wie toll doch ZL sei. Ausserdem haben wir eigene Terminals für die Verifizierung und Group-Invite-Schilder. Beides findest Du kostenlos im Marktplatz.
Bitte stell einfach soviel wie möglich überall dort auf, wo Du Baurechte hast. Je mehr davon "im Umlauf" sind, desto grösser und bekannter wird ZL!


.
Benutzeravatar
Criz Collins
Administrator
 
Beiträge: 1162
Registriert: Sa 27. Dez 2008, 19:22
Wohnort: Kaufbeuren
Skype Name: a.mieland
SL Geburtstag: 12. Aug 2007
SL Avatar Name: Criz Collins
SL Heimat Region: Vodka
SL Lieblings Region: Vodka


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Sklavin Randt » Mo 16. Mär 2009, 10:47

Na du bist doch nu auch da daheim
Wie währe es mit einer Bayrischen Uhr Bild
Dateianhänge
bayrische Uhr.gif
Setz dich an einen Fluss und warte:
Die Leichen deiner Feinde werden schon bald vorüber treiben.


Indianisches Sprichwort
Benutzeravatar
Sklavin Randt

 
Beiträge: 596
Registriert: Mo 29. Dez 2008, 18:53
SL Geburtstag: 16. Dez 2007
SL Avatar Name: Sklavin Randt

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Bent Messmer » Mo 16. Mär 2009, 11:39

Ich finde die Tutorials ja klasse, aber noch klasser finde ich ja, daß unsere Gesellschaft auf dem Prinzip der Arbeitsteilung aufgebaut ist und ich nicht alles können muß. Es wird mir für immer ein Rätsel bleiben, wie scripten Spaß machen kann.:-)

Dumm geboren und die Hälfte schon wieder vergessen, aber gnadenlos glücklich damit, Bent
Bent Messmer

 

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Jenni Eales » Mo 16. Mär 2009, 12:13

@Criz, darum sagt ja auch ein deutsches Sprichwort "wer zuerst kommt, tutorialt zuerst."

@Kerstin, Ich werde dir an geeigneter Stelle zeigen, wo du einfach das Vorzeichen wechseln musst.

@Bent, für Leute wie dich Gips nachher alles in nem hübschen Kistchen zum selber rezzen und fertig.
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Wolwaner Jervil » Di 17. Mär 2009, 09:09

Erstens - Gaaaanz super!
Zweitens - ich finde den Titelverschreiber Klasse - Turtorial - sollte es dann für die nicht-scripter Tortourial heissen ???? :zunge:
Drittens - weitermachen - endlich lerne ich auch richtig scripten.
Viertens - ich arbeite an einer "Begradigung" - eine Stunde sollte dann doch wenigsten 10000 Sekunden haben (oder war da was mit Greedy) :D
Wol,
SL Guided Tours - wir zeigen euch SL
Benutzeravatar
Wolwaner Jervil

 
Beiträge: 149
Registriert: Mi 31. Dez 2008, 13:56
SL Geburtstag: 1. Dez 2006
SL Avatar Name: Wolwaner Jervil


  •  

Wir baun uns eine Uhr - Torturial Teil 2

Neuer Beitragvon Jenni Eales » Di 17. Mär 2009, 10:09

Hallo zusammen,

heute geht es weiter mit unserem Tutorial. Nachem wir im ersten Teil Stunden, Minuten und Sekunden ausgerechnet haben, werden wir nun daraus eine Rotation berechnen und den Zeiger in regelmäßigen Abständen um ein paar Grad weiter schieben.

Fangen wir mit dem Sekundenzeiger an. Dazu benötigen wir als erstes einen Timer, der jede Sekunde einen Timer Event auslöst. Diesen starten wir mit

Code: Alles auswählen
state_entry()
{
    llSetTimerEvent(1.0);
}

Der Timer ruft nun jede Sekunde das Event timer() auf und dort kommt nun unser Code rein. Aus dem Code berechnen wir den Rotationswinkel in Grad und erst mal als Vektor. Dabei sollen 60 Minuten einem Winkel von 360 Grad entsprechen, also

Code: Alles auswählen
vector rot = <0, 0, getSeconds(timezone_offset) * 360 / 60>;

Damit hätten wir nun Kerstins bayrische Uhr mit einem rückwärts laufenden Zeiger. In meiner version sind die prims so ausgerichtet, dass ich ein Minuszeichen vor den Funktionsaufruf platzieren muss.

Nun müssen wir mit den Winkeln zwei Dinge tun.

Zuerst rechnen wir die Winkel um in Bogenmaß. Hier ist eine ganze Drehung nicht 360 Grad sondern 2 Pi. In Linden Script gibt es dafür die Umrechnungskonstante DEG_TO_RAD.

Im zweiten Schritt wandenln wir den (Eulerschen) Rotations-Vektor in die Quat-Form um. Auch dazu gibt es in LSL eine Funktion.

Code: Alles auswählen
rotation quat = llEuler2Rot(rot * DEG_TO_RAD);

Diese rotation können wir direkt an das Prim übergeben, um es zu drehen.

Code: Alles auswählen
llSetLocalRot(quat);

Das ganze Script sieht nun folgendermaßen aus:

Code: Alles auswählen
integer timezone_offset = 1;

integer getHours(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);

    return hours;
}

integer getMinutes(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);
    integer minutes = llFloor((ft - (hours*3600)) / 60.0);

    return minutes;
}

integer getSeconds(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer seconds = llFloor(ft) % 60;

    return seconds;
}

default
{
    state_entry()
    {
        llSetTimerEvent(1.0);
    }

    timer()
    {
        vector rot = <0, 0, -getSeconds(timezone_offset) * 360 / 60>;
        rotation quat = llEuler2Rot(rot * DEG_TO_RAD);
        llSetLocalRot(quat);
    }

    link_message(integer sender_number, integer number, string message, key id)
    {
        if(number == 3600)
        {
            timezone_offset = (integer) message;
        }
    }
}

Ihr seht, das Script ist darauf vorbereitet, mit Zeitzonen zu arbeiten, so wie es unsere Funktionen auch bereits können. Das wird im nächsten Teil dann für den Stundenzeiger wichtig.

Die anderen Zeiger folgen demnächst. Ich denke, ihr könnt fast erraten, wie die entsprechenden Scripte aussehen.

Viel Spaß beim tüfteln,
eure Jenni
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Wir baun uns eine Uhr - Tutorial Teil 3

Neuer Beitragvon Jenni Eales » Mi 18. Mär 2009, 09:44

Hallo Klasse,

nachdem ihr nun schon gespannt auf die Scripte wartet, will ich sie euch nun nicht länger vorenthalten.

Wie ihr schon ganz richtig vermutet habt, sieht das Script für den Minutenzeiger fast genauso aus wie das für den Stundenzeiger. Statt getSeconds() rufen wir einfach getMinutes() auf (Kerstin, das Minuszeichen löschen, gell!)

Code: Alles auswählen
integer timezone_offset = 1;

integer getHours(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);

    return hours;
}

integer getMinutes(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);
    integer minutes = llFloor((ft - (hours*3600)) / 60.0);

    return minutes;
}

integer getSeconds(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer seconds = llFloor(ft) % 60;

    return seconds;
}

default
{
    state_entry()
    {
        llSetTimerEvent(1.0);
    }

    timer()
    {
        vector rot = <0, 0, -getMinutes(1) * 360 / 60>;
        rotation quat = llEuler2Rot(rot * DEG_TO_RAD);
        llSetLocalRot(quat);
    }

    link_message(integer sender_number, integer number, string message, key id)
    {
        if(number == 3600)
        {
            timezone_offset = (integer) message;
        }
    }
}


Ein bisschen komplizierter wird es beim Stundenzeiger. Der soll wie bei ner richtigen Uhr nicht erst zu Beginn einer neuen Stunde weiter hüpfen, sondern sich kontinuierlich weiter bewegen, damit er zum Beispiel um halb 10 genau zwischen der neun und der zehn steht. Oder um halb vier zwischen drei und vier. Weitere Beispiele bei Bedarf... ;-)

Das lösen wir einfach, indem wir die Minuten bei der Berechnung des Drehwinkels für den Stundenzeiger ebenfalls berücksichtigen.

Code: Alles auswählen
vector rot = <0, 0, -(getHours(timezone_offset) + (float)getMinutes(timezone_offset) / 60) * 360 / 12>;


Damit sieht das Script für den Sekundenzeiger folgendermaßen aus:

Code: Alles auswählen
integer timezone_offset = 1;

integer getHours(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);

    return hours;
}

integer getMinutes(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);
    integer minutes = llFloor((ft - (hours*3600)) / 60.0);

    return minutes;
}

integer getSeconds(integer vIntLocalOffset)
{
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer seconds = llFloor(ft) % 60;

    return seconds;
}

default
{
    state_entry()
    {
        llSetTimerEvent(1.0);
    }

    timer()
    {
        vector rot = <0, 0, -(getHours(timezone_offset) + (float)getMinutes(timezone_offset) / 60) * 360 / 12>;
        rotation quat = llEuler2Rot(rot * DEG_TO_RAD);
        llSetLocalRot(quat);
    }

    link_message(integer sender_number, integer number, string message, key id)
    {
        if(number == 3600)
        {
            timezone_offset = (integer) message;
        }
    }
}


Soviel für heute.

Eure Jenni
Zuletzt geändert von Jenni Eales am Fr 20. Mär 2009, 18:07, insgesamt 1-mal geändert.
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Wir baun uns eine Uhr - Tutorial Teil 4

Neuer Beitragvon Jenni Eales » Do 19. Mär 2009, 09:39

Heute stelle ich euch das letzte Script dieses Tutorials vor. Es dient dazu, die Zeitzone auszuwählen und an die Zeiger-Scripte zu übergeben. Darüber hinaus soll ein optionaler Hovertext mit einer Digitalanzeige der Zeit ein- und ausgeschaltet werden können.

Das ganze Script ist etwas länglich, aber ich will es euch in kleinen Dosen verabreichen und ein bisschen erklären, was die einzelnen Code-Stücke tun.

Ganz oben im Script fangen wir mit Konstanten und Variablen an. Im Gegensatz zu anderen Sprachen unterscheidet LSL nicht zwischen diesen beiden Sorten. Ich habe es mir dennoch angewöhnt, beide getrennt zu betrachten und Konstanten in Großbuchstaben zu benennen, wie es in Java üblich ist.

Code: Alles auswählen
// constants
vector HOVERTEXT_COLOR = <1, 1, 1>;
list ZONES = ["-12", "-11", "-10", "-9", "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1",
    "0", "+1", "+2", "+3", "+4", "+5", "+6", "+7", "+8", "+9", "+10", "+11", "+12"];

list ZONE_NAMES = ["UTC-12", "UTC-11", "UTC-10", "UTC-9", "SL Time (-8)", "MT (-7)",
    "CT (-6)", "ET (-5)", "AT (-4)", "UTC-3", "UTC-2", "UTC-1",
    "GMT (0)", "CET (+1)", "UTC+2", "UTC+3", "UTC+4", "UTC+5",
    "UTC+6", "UTC+7", "UTC+8", "UTC+9", "UTC+10", "UTC+11", "UTC+12"];

list ZONE_TOWNS = ["Wellington", "Apia", "Honolulu", "Achorage", "Los Angeles", "Phoenix",
    "Mexico City", "New York", "Santiago", "Sao Paulo", "Fernando de Noronha Island", "Cape Verde",
    "London", "Berlin, Paris", "Cairo", "Moscow", "Dubai", "Karachi", "Dhaka", "Jakarta",
    "Hong Kong", "Tokyo", "Sydney", "New Caledonia", "Wellington"];

string BUTT_NEXT   = ">>";
string BUTT_PREV   = "<<";
string BUTT_OK     = "OK";
string BUTT_HT_OFF = "HT off";
string BUTT_HT_ON  = "HT on";

// state
integer timezone_offset = 1;
integer selected = 12;
integer isHovertext = FALSE;

// for internal use
integer channel = 0;
integer listen_handle;

Es folgen eine Menge Funktionen, die an geeigeneter Stelle aufgerufen werden, darunter der Hauptteil des Scriptes, hier mit einem default State.

Code: Alles auswählen
default
{
    state_entry()
    {
        timezone_offset = llList2Integer(ZONES, selected);
        channel = (integer)llFrand(99999)+99999;

        listen_handle = llListen(channel, "", NULL_KEY, "");
        llListenControl(listen_handle, FALSE);
        llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
    }
   
   ...
}

Zu Beginn der Scriptausführung initialisieren wir den Kanal für den Dialog und öffnen ein Handle. Dann bekommen über eine linked message alle Zeiger eine voreingestellte Zeitzone als Startwert übergeben.

Bis jetzt noch nichts wirklich interessantes. Nun soll das Script beim "touch" durch den Owner den Dialog öffnen. Richtig, wir benötigen ein touch() Event:

Code: Alles auswählen
    touch_start(integer total_number)
    {
        key avatar = llDetectedKey(0);
        if(avatar == llGetOwner())
        {
            show_dialog(avatar);
        }
    }

show_dialog() ist eine der Funktionen, die ich vorhin übersprungen habe. Sie definiert den Dialog mit seiner Textmeldung und den Buttons.
Code: Alles auswählen
show_dialog(key id)
{
    string text = "";
    text += "Current time: " + getTimeString(timezone_offset);
    text += "\nTimezone: " + llList2String(ZONE_NAMES, selected);
    text += " (" + llList2String(ZONE_TOWNS, selected) + ")";
    text += "\nHovertext: " + getText(isHovertext);

    list buttons = [BUTT_PREV, BUTT_OK, BUTT_NEXT];
    if(isHovertext)
    {
        buttons += [BUTT_HT_OFF];
    }
    else
    {
        buttons += [BUTT_HT_ON];
    }

    llListenControl(listen_handle, TRUE);
    llDialog(id, text, buttons, channel);
}

Der Dialog stellt vier Buttons dar: Einen OK-Button zum Beenden des Dialogs, je einen zum vorwärts und rückwärts blättern und einen zum ein- und ausschalten des Hovertexts.

Nun benötigen wir nur noch eine Implementierung des listen() Events, um auf die einzelnen Buttons zu reagieren.
Code: Alles auswählen
    listen(integer channel, string name, key id, string message)
    {
        if(message == BUTT_OK)
        {
            llListenControl(listen_handle, FALSE);
            return;
        }

        if(message == BUTT_NEXT)
        {
            selected++;
            if(selected > 24)
            {
                selected = 0;
            }
            timezone_offset = llList2Integer(ZONES, selected);
            llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
        }

        if(message == BUTT_PREV)
        {
            selected--;
            if(selected < 0)
            {
                selected = 24;
            }
            timezone_offset = llList2Integer(ZONES, selected);
            llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
        }

        if(message == BUTT_HT_ON)
        {
            isHovertext = TRUE;
            llSetTimerEvent(1.0);
        }

        if(message == BUTT_HT_OFF)
        {
            isHovertext = FALSE;
            llSetTimerEvent(0.0);
            llSetText("", HOVERTEXT_COLOR, 1.0);
        }

        show_dialog(id);
    }

Der OK-Button deaktiviert den Listen Handler (um bisschen lag zu sparen). PREV und NEXT erniedrigen bzw. erhöhen den Wert der Variable selected und ermitteln daraus den in der Liste gespeicherten Wert für den Zeitunterschied. Diesen bekommen dann wieder unsere Zeiger.

BUTT_HT_ON und startet einen Timer, der aus der Zeit einen String errechnet und als Hovertext anzeigt:

Code: Alles auswählen
    timer()
    {
        if(isHovertext)
        {
            llSetText(getTimeString(timezone_offset), HOVERTEXT_COLOR, 1.0);
        }
    }

Die dafür benötigte Funktion getTimeString() funktioniert wie die Funktionen aus dem ersten Teil des Tutorials. Anstatt Stunden, Minuten und Sekunden einzeln zu ermitteln, werden sie hier in einer Funktion geholt und zu einem String zusammengebaut.

Das war's auch schon für heute. Hier nochmal das ganze Script:

Code: Alles auswählen
// constants
list ZONES = ["-12", "-11", "-10", "-9", "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1",
    "0", "+1", "+2", "+3", "+4", "+5", "+6", "+7", "+8", "+9", "+10", "+11", "+12"];

list ZONE_NAMES = ["UTC-12", "UTC-11", "UTC-10", "UTC-9", "SL Time (-8)", "MT (-7)",
    "CT (-6)", "ET (-5)", "AT (-4)", "UTC-3", "UTC-2", "UTC-1",
    "GMT (0)", "CET (+1)", "UTC+2", "UTC+3", "UTC+4", "UTC+5",
    "UTC+6", "UTC+7", "UTC+8", "UTC+9", "UTC+10", "UTC+11", "UTC+12"];

list ZONE_TOWNS = ["Wellington", "Apia", "Honolulu", "Achorage", "Los Angeles", "Phoenix",
    "Mexico City", "New York", "Santiago", "Sao Paulo", "Fernando de Noronha Island", "Cape Verde",
    "London", "Berlin, Paris", "Cairo", "Moscow", "Dubai", "Karachi", "Dhaka", "Jakarta",
    "Hong Kong", "Tokyo", "Sydney", "New Caledonia", "Wellington"];

string BUTT_NEXT   = ">>";
string BUTT_PREV   = "<<";
string BUTT_OK     = "OK";
string BUTT_HT_OFF = "HT off";
string BUTT_HT_ON  = "HT on";

vector HOVERTEXT_COLOR = <1, 1, 1>;

// state
integer timezone_offset = 1;
integer selected = 12;
integer isHovertext = FALSE;

// for internal use
integer channel = 0;
integer listen_handle;

string getTimeString(integer vIntLocalOffset) {
    integer ft = ((integer) llGetGMTclock() + 86400 + vIntLocalOffset * 3600) % 86400;
    integer hours = llFloor(ft / 3600);
    integer minutes = llFloor((ft - (hours*3600)) / 60.0);
    integer seconds = llFloor(ft) % 60;

    string result = (string) hours + ":";
    if(minutes < 10) result += "0";
    result += (string)minutes + ":";
    if(seconds < 10) result += "0";
    result += (string)seconds;

    return result;
}

string getText(integer boolean)
{
    if(boolean)
    {
        return "ON";
    }
    else
    {
        return "OFF";
    }
}

show_dialog(key id)
{
    string text = "";
    text += "Current time: " + getTimeString(timezone_offset);
    text += "\nTimezone: " + llList2String(ZONE_NAMES, selected);
    text += " (" + llList2String(ZONE_TOWNS, selected) + ")";
    text += "\nHovertext: " + getText(isHovertext);

    list buttons = [BUTT_PREV, BUTT_OK, BUTT_NEXT];
    if(isHovertext)
    {
        buttons += [BUTT_HT_OFF];
    }
    else
    {
        buttons += [BUTT_HT_ON];
    }

    llListenControl(listen_handle, TRUE);
    llDialog(id, text, buttons, channel);
}

default
{
    state_entry()
    {
        timezone_offset = llList2Integer(ZONES, selected);
        channel = (integer)llFrand(99999)+99999;

        listen_handle = llListen(channel, "", NULL_KEY, "");
        llListenControl(listen_handle, FALSE);
        llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
    }

    timer()
    {
        if(isHovertext)
        {
            llSetText(getTimeString(timezone_offset), HOVERTEXT_COLOR, 1.0);
        }
    }

    touch_start(integer total_number)
    {
        key avatar = llDetectedKey(0);
        if(avatar == llGetOwner())
        {
            show_dialog(avatar);
        }
    }

    listen(integer channel, string name, key id, string message)
    {
        if(message == BUTT_OK)
        {
            llListenControl(listen_handle, FALSE);
            return;
        }

        if(message == BUTT_NEXT)
        {
            selected++;
            if(selected > 24)
            {
                selected = 0;
            }
            timezone_offset = llList2Integer(ZONES, selected);
            llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
        }

        if(message == BUTT_PREV)
        {
            selected--;
            if(selected < 0)
            {
                selected = 24;
            }
            timezone_offset = llList2Integer(ZONES, selected);
            llMessageLinked(LINK_ALL_OTHERS, 3600, (string) timezone_offset, NULL_KEY);
        }

        if(message == BUTT_HT_ON)
        {
            isHovertext = TRUE;
            llSetTimerEvent(1.0);
        }

        if(message == BUTT_HT_OFF)
        {
            isHovertext = FALSE;
            llSetTimerEvent(0.0);
            llSetText("", HOVERTEXT_COLOR, 1.0);
        }

        show_dialog(id);
    }
}

Viel Spaß beim analysieren und tüfteln,
eure Jenni
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Wir baun uns eine Uhr - Tutorial Teil 5

Neuer Beitragvon Jenni Eales » Fr 20. Mär 2009, 11:12

Wir kommen schon zum letzten Teil dieses Tutorials - pünktlich zum Wochenende, so dass ihr das morgen gleich mal ausprobieren könnt.

Heute packen wir unsere 4 Scripte in die Uhr, verzieren sie mit den entsprechenden Texturen und fertig ist die Laube.

Als erstes rezzen wir einen neuen Zylinder. Damit wir nicht gleich die Lupe brauchen, stellen wir die Abmessungen auf 1.0m x 1.0m x 0.1m ein.

Dann drücken wir die Shift-Taste und machen uns drei Kopien direkt übereinander, etwa so wie auf dem Bild:

clock1.jpg


Nun kommen die Texturen auf die Scheiben: ganz oben die für den Sekundenzeiger, dann der Minutenzeiger, Stundenzeiger und schließlich das Ziffernblatt auf die unterste Scheibe.

clock2.jpg


Die Ränder bekommen eine druchsichtige Textur. Dann packen wir in jede Scheibe das passende Script.

clock3.jpg


Nun verlinken wir die drei Scheiben. Dazu klicken wir sie bei gedrückter Shift-Taste nacheinander an, das Ziffernblatt zuletzt, denn das soll nachher das Root-prim werden.

Mit STRG + L verknüpfen wir die Teile zu einem Objekt.

Nun setzen wir das Häkchen bei "Verknüpfte Teile bearbeiten" und schieben die einzelnen Scheiben so übereinander, dass alle Zeiger sichtbar sind und sie möglichst nahe am Ziffernblatt sind. Am genausten geht das, wenn ihr die z-Koordinate des Objektes in dem Bearbeiten-Dialog einstellt.

Nun müssten die Zeiger auch schon loslaufen. Startet mal das haupt-Script im Root-prim mit einem "touch". In dem Auswahldialog müsstet ihr nun die Zeitzone ändern können.

Zuletzt bringen wir die Uhr auf die endgültige Größe, je nachdem ob es eine Wanduhr, eine Armbanduhr oder eine Kirchturmuhr werden soll.

Wer mag, kann statt den drei Scheiben auch eine Uhr mit richtigen Zeigern bauen. Dazu wählt ihr die Grundform "Quader" und stellt den Pfadabschnitt auf B: 0.125 und E: 0.625. Damit wird eine Hälfte des Quaders abgeschnitten und der Drehpunkt sitzt in der Mitte.

hands.jpg


So das war's. Ne Kiste mit allen Scripten, Texturen und beiden Uhrvarianten in "full perm" stell ich als Freebie-Kiste in den nächsten Tagen in meinen Shop.

Viel Spaß beim großen Einstieg in die Uhrenproduktion!

Eure Jenni
Zuletzt geändert von Jenni Eales am Fr 20. Mär 2009, 18:06, insgesamt 1-mal geändert.
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon XPhile Boucher » Fr 20. Mär 2009, 16:16

danke jenni, super sache! Bild
Es gibt keine blöden Fragen - nur blöde Antworten!:D
Hier ist mein neuer Blog: http://xphile.net :)


Bild
Benutzeravatar
XPhile Boucher

 
Beiträge: 771
Registriert: So 28. Dez 2008, 15:23
Wohnort: Kaufbeuren
Skype Name: xphile85
SL Geburtstag: 3. Feb 2007
SL Avatar Name: XPhile Boucher
SL Heimat Region: Vodka


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Jenni Eales » Fr 20. Mär 2009, 18:16

So, nun gibt es das ganze Paket in meinem Shop oder bei XStreet SL.

Edit:
Die bayrische Version gibts auch, aber nur bei mir auf Anfrage. :zunge: :zunge: :zunge:
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Rebekka Revnik » Fr 20. Mär 2009, 22:42

Super Jenni - hab schon die ganze Zeit auf die Zeiger und das Zifferblatt gewartet hihi, weil ich bin ne grafische Null :)
LG Reb
Benutzeravatar
Rebekka Revnik

 
Beiträge: 319
Registriert: Fr 2. Jan 2009, 11:50
Wohnort: Sachsen
SL Geburtstag: 5. Mär 2008
SL Avatar Name: Rebekka Revnik
SL Heimat Region: Kuroni

Re: Wir baun uns eine Uhr - Turtorial

Neuer Beitragvon Jenni Eales » Di 24. Mär 2009, 15:15

/me freut sich, denn sie hat bei SLX schon 30mal die Uhrenscriptkiste "verkauft". Schön wär's auch, wenn ihr mir bei XStreet ne Bewertung und/oder ein Review hinterlassen würdet! (Nur um sicher zu gehen, dass ich auch langfristig sehr motiviert bleibe....)
Meine Shops: Xstreet SL - Volksland Beach - NEU: Apez :: Blog: jennieales.wordpress.com :: Twitter: @jenni_eales
Benutzeravatar
Jenni Eales

 
Beiträge: 608
Registriert: Mo 29. Dez 2008, 19:40
Wohnort: Wilder Süden
SL Geburtstag: 28. Aug 2007
SL Avatar Name: Jenni Eales


  •  


Zurück zu Tutorials

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast