Eigene Echtzeit Uhr erstellen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • In diesem Tutorial erkläre ich euch, wie ihr eine solche Uhr Scripten könnt.




    Schritt 1 - Erstellung des Textdraws


    Zu erst benötigen wir einen Textdraw, der die Uhr darstellt.
    Am besten können wir Textdraws mit einem Filterscript "Desingnen".
    Ich empfehle euch dieses Filterscript: http://forum.sa-mp.com/showthr…highlight=textdraw+editor
    Nachdem wir den Textdraw erstellt haben, fügen wir ihn in unseren GameMode ein.


    Schritt 2 - Einfügen des Textdraws in den GameMode


    In unserem Fall nennen wir den Textdraw "RealClock" (= Echtzeit Uhr).
    Folgendes muss in den GameMode eingefügt werden:


    Unter die Includes:
    new Text:RealClock; //Definiert den Textdraw RealClock


    Unter public OnGameModeInit()
    RealClock = TextDrawCreate(545.000000, 21.000000, "15:17"); //Erstellt einen Textdraw mit dem Namen RealClock und mit einem leeren String, da wir den String später mit einem Timer definieren
    TextDrawBackgroundColor(RealClock, 255); //Hintergrundfarbe des Textdraws
    TextDrawFont(RealClock, 3); //Schriftart des Textdraws (mögliche Schriftarten: 0,1,2 und 3)
    TextDrawLetterSize(RealClock, 0.509999, 2.299999); //größe des Textdraws
    TextDrawColor(RealClock, -1); //Farbe des Textdraws (-1 = Weiß)
    TextDrawSetOutline(RealClock, 0); //Kontur des Textdraws
    TextDrawSetProportional(RealClock, 1);
    TextDrawSetShadow(RealClock, 1);


    Schritt 3 - Einstellen des Timers


    Als nächstes benötigen wir einen Timer, um die Uhrzeit immer Aktuell zu halten.
    Den Timer erstellen wir mit SetTimer("UpdateClock",1000,1);
    UpdateClock = Aufrufen des Publics "UpdateClock"
    1000 = Anzahl wie oft das Public "UpdateClock" aufgerufen werden soll. (in unserem fall alle 1000 Millisekunden)
    1 = Ob der Timer das Public "UpdateClock" nach den 1000 Millisekunden nochmals aufrufen soll, also quasi ob der Tiemr sich wiederholen soll.


    Folgendes muss in den GameMode eingefügt werden:


    Unter die Includes:
    forward UpdateClock(); //für das Public "UpdateClock"



    Unter public OnGameModeInit()
    SetTimer("UpdateClock",1000,1); //Erstellt den Timer


    Schritt 4 - einrichten des Publics "UpdateClock"


    Nun sind wir beim letzten Schritt angekommen.
    Da wir die Uhr ja ständig am aktuellsten Stand halten wollen, benötigen wir diesen Timer, der die Uhr ständig aktualisiert.
    Zuerst müssen wir die Symbole definieren, wie z.B Stunde, Minute, Sekunde auch den "String" müssen wir definieren.
    Um die aktuellste Zeit zu erhalten benötigen wir "gettime" mit dieser Funktion erhalten wir ständig die aktuellste Zeit.


    Folgendes muss in den GameMode eingefügt werden:


    public UpdateClock()
    {
    new Hour,Minute,Sec,String[256]; //Definiert die Symbole
    gettime(Hour,Minute,Sec); //Holt sich die aktuelle Zeit (vom Rechner oder Server)
    if(Hour<9 && Minute<9){format(String,sizeof(String),"0%d:0%d",Hour,Minute);}
    else if(Hour>9 && Minute<9){format(String,sizeof(String),"%d:0%d",Hour,Minute);}
    else if(Hour<9 && Minute>9){format(String,sizeof(String),"0%d:%d",Hour,Minute);}
    else{format(String,sizeof(String),"%d:%d",Hour,Minute);}
    TextDrawSetString(RealClock,String); //Updatet den TextDraw mit der Aktuellsten Uhrzeit
    SetWorldTime(Hour); // Setzt die InGame Zeit auf die RealLife Zeit, sodass wenn es in echt Nacht ist, es auch InGame Nacht ist
    return 1;
    }

    Viel Spaß beim ausprobieren!
    Über Kommentare würde ich mich sehr freuen.


    Download der Uhr als Filterscript: http://solidfiles.com/d/7077/

    3 Mal editiert, zuletzt von KKM ()

  • 8/10: Für anfænger richtig gut, da können sie wieder vieles lernen :>
    Nur wieso wird das Callback jeden 300 Milisek. aufgerufen ??
    Das Uhr muss ja nur jede Sekunde geupdated werden.
    Wenn du eine Uhrzeit mit Milisekunden machst ist es natürlich anders, aber es ist sinnlos das es alle 0.3 sekunden geupdated wird.
    So frisst es unnötig zu viel Ressourcen mit alle 0.3 sekunden update.

  • Ja, ich hatte das in meinem RealLife GameMode so drin, da ich den Timer den ich für die Uhr verwende auch für meinen Tacho verwende.
    Habs geupdatet auf 1 Sekunde.


    mfg

  • Genau, das kann man ja ganz einfach per Timer verwirklichen.
    Und vielleicht mit einer Random funktion.

    mfg

    Einmal editiert, zuletzt von KKM ()

  • Bei mir komt immer diese fehlermeldung


    C:\Dokumente und Einstellungen\Kevin\Desktop\samp03asvr_R8_win32\gamemodes\Neon-Reallife.pwn(44) : warning 225: unreachable code
    C:\Dokumente und Einstellungen\Kevin\Desktop\samp03asvr_R8_win32\gamemodes\Neon-Reallife.pwn(54) : warning 209: function "OnGameModeInit" should return a value
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    2 Warnings.

    Bitte um Hilfe
    MFG
    PIPAPAUL

  • C:\Users\Fanta\Desktop\Server\filterscripts\Uhr.pwn(54) : error 017: undefined symbol "Hour"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.


    Zeile



    SetWorldTime(Hour); [color=green]// Setzt die InGame Zeit auf die RealLife Zeit, sodass wenn es in echt Nacht ist, es auch InGame Nacht ist

    [/color]


    Help...

    mfg

  • Geht auch einfacher ....


    public UpdateClock()
    {
    new Hour,Minute,String[32];//Definiert die Symbole
    gettime(Hour,Minute);//Holt sich die aktuelle Zeit (vom Rechner oder Server)
    format(String,sizeof(String),"%02d:%02d",Hour,Minute);
    TextDrawSetString(RealClock,String);//Updatet den TextDraw mit der Aktuellsten Uhrzeit
    SetWorldTime(Hour);
    return 1;
    }
    Wesentlich angenehmer, Ressourcensparender & Spart Zeilen ... :)

  • Ich habe alles eingeffügt.
    Bekomme kein Error oder Warning.
    Aber Ingame ist sie nicht :s



    Viele Grüße,


    Alex