Eine Simple Uhr erstellen (keine Text-Zeit angabe - eine Uhr!)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Eine Simple Uhr erstellen (keine Text-Zeit angabe - eine Uhr!)

      So, dann will ich euch mal Zeigen wie man seine eigene Uhr erstellen kann, und das ganz leicht!
      Aber vorweg -> Stellt euch nicht den megabrüller vor, es ist ein Grundgerüst das funktioniert - nicht mehr, aber auch nicht weniger ;)
      Wichtig: Die Lite-Version des Game Maker 7 wird aufgrund des verwendeten Befehls draw_sprite_ext(); nicht unterstützt.

      1. Vorbereitung
      Was brauchen wir also nun? Wir brauchen
      1 Sprite, 2 Skripts, 1 Objekt, 1 Raum

      Bennent das Sprite bitte s_pointer, macht es 1x1 px groß, und macht den hacken bei "Transparent" weg.

      Edit:
      Außerdem solltet ihr den 1x1 px weiß malen! Denn wie ich grade von bemerkt habe, geht dies bei Schwarz nicht (weitere Farben teste ich jetzt nicht - einfach den Pixel weiß machen und alles klappt ;))

      Die 2 Skripte nennt ihr am besten "draw_uhr", und "draw_pointer" (ansonsten müsst ihr auch innerhalb der Skripte die namen ändern, gleiche gilt für das Sprite)
      Objekt und Raum name sind egal ;)

      2. Skripte einbauen
      Kopiert meine vorgefertigten Skripte, die beide natürlich Kommentiert sind - wer also mehr als sie nur benutzten will, sie vertehen will, sollte sich die Kommentare durchlesen ^^

      Spoiler anzeigen
      draw_uhr

      GML-Quellcode

      1. {
      2. // draw_uhr(xpos,ypos,rad,hh,mm,ss,col_hh,col_mm,col_ss,col_br,back_c,alpha);
      3. // ====================================================================================
      4. // Copyright Pascal 'Metalknight' Piduhn 2009 | Kontakt: MSN | E-mail
      5. // Credits wäre nett, ist aber kein muss ;) | metalknight2009@live.de
      6. // ====================================================================================
      7. // 1. Argumente in den entsprechnenen lokalen (!) Variablen speichern
      8. var xpos, ypos, rad, hh, mm, ss, col_hh, col_mm, col_ss, col_br, back_c;
      9. xpos = argument0; // X-Position der Uhr
      10. ypos = argument1; // Y-Position der Uhr
      11. rad = max(25,argument2); // Radius (25<) der Uhr (äußerster Radius!!!)
      12. hh = argument3; // Stunden-Zeiger der Uhr
      13. mm = argument4; // Minuten-Zeiger der Uhr
      14. ss = argument5; // Sekunden-Zeiger der Uhr
      15. col_hh = argument6; // Farbe des Stunden Zeigers der Uhr
      16. col_mm = argument7; // Farbe des Minuten Zeigers der Uhr
      17. col_ss = argument8; // Farbe des Sekunden Zeigers der Uhr
      18. col_br = argument9; // Farbe des Rands der Uhr
      19. back_c = argument10; // Farbe des Hintergrunds der Uhr
      20. alpha = argument11; // Der Alpha-Wert der Uhr (Die Pfeile sind in einen
      21. // extra Skript (draw_pointer) und haben einen festen Alpha-Wert (1|100%)!)
      22. // Hier werden, bevor wir die Werte verändern, der Farb- und Alphawert gespeichert
      23. // um diese nach ausführen des Skripts zurückzusetzten.
      24. var o_alpha, o_col;
      25. o_alpha = draw_get_alpha();
      26. o_col = draw_get_color();
      27. // 2.1 Grundgerüst der Uhr zeichnen
      28. draw_set_alpha(alpha);
      29. draw_set_color(back_c);
      30. draw_circle(xpos,ypos,rad,false);
      31. draw_set_color(col_br);
      32. draw_circle(xpos,ypos,rad,true);
      33. // 2.2 Die typisch, schwarze Striche Zeichen (bei 0,3,6,9 Uhr)
      34. /// Achtung: Die Striche werden hier mit der col_br Farbe gezeichnet, da ich dies
      35. /// für besser halte (was nicht heißt, dass man dies nicht ändern könnte)
      36. draw_line(xpos,ypos-rad*0.3,xpos,ypos-rad*0.7); // 0 Uhr
      37. draw_line(xpos+rad*0.3,ypos,xpos+rad*0.7,ypos); // 3 Uhr
      38. draw_line(xpos,ypos+rad*0.3,xpos,ypos+rad*0.7); // 6 Uhr
      39. draw_line(xpos-rad*0.3,ypos,xpos-rad*0.7,ypos); // 9 Uhr
      40. // 3. Einzeichnen der Zeiger (hh:mm:ss)
      41. /// Mithilfe meines draw_pointer Skriptes, und dem Sprites "s_pointer" werden die Zeiger
      42. /// ganz Einfach gezeichnet.
      43. draw_pointer(xpos,ypos,rad*0.6,hh,col_hh,12);
      44. // draw_pointer(xpos,ypos,rad,tt,col,format);
      45. draw_pointer(xpos,ypos,rad*0.8,mm,col_mm,60);
      46. // draw_pointer(xpos,ypos,rad,tt,col,format);
      47. draw_pointer(xpos,ypos,rad,ss,col_ss,60);
      48. // draw_pointer(xpos,ypos,rad,tt,col,format);
      49. // 4. "Outro"
      50. /// Den Alpha- und Farbwert zurücksetzten, auf die vor dem Skript benutzten Einstellungen
      51. draw_set_color(o_col);
      52. draw_set_alpha(o_alpha);
      53. }
      Alles anzeigen


      Spoiler anzeigen
      draw_pointer

      GML-Quellcode

      1. {
      2. // draw_pointer(xpos,ypos,rad,tt,col,format);
      3. // ====================================================================================
      4. // Copyright Pascal 'Metalknight' Piduhn 2009 | Kontakt: MSN | E-mail
      5. // Credits wäre nett, ist aber kein muss ;) | metalknight2009@live.de
      6. // ====================================================================================
      7. // 1. Argumente in den entsprechnenen lokalen (!) Variablen speichern
      8. var xpos, ypos, rad, tt, col, format;
      9. xpos = argument0; // Die X-Position des Zeigers
      10. ypos = argument1; // Die Y-Position des Zeigers
      11. rad = argument2; // Der Radius, des Zeigers, in dem er sich drehen soll
      12. tt = argument3; // Die Zeit, die der Zeiger darstellen soll
      13. col = argument4; // Die Farbe, die der Zeiger haben soll
      14. format = argument5; // Das Format der Zeit (bspl.: Sekunden -> 60, Stunden -> 12)
      15. // 2. Der Zeiger wird mit Hilfe eines 1x1 (px) großen Sprites gezeichnet
      16. /// (!)ACHTUNG: Das Sprite sollte weiß sein und man muss das
      17. /// Häckschen bei "Transparent" weg machen(!)
      18. draw_sprite_ext(s_pointer,0,xpos,ypos,1,-(rad*0.8),-(360/format*tt),col,1);
      19. }
      Alles anzeigen


      3. Das Objekt
      Im Create Event des Objektes müssen wir nun die Zeit "erstellen". Hierfür erstellen wir drei Variablen (public, also nicht mit var definieren). Ich habe sie hh,mm,ss genannt. Will man das die Uhrzeit eine bestimmte Zeit angibt, initialisiert man sie mit der gewünschten Zeit - ansonsten einfach mit einer 0 initialisieren.

      Falls man will, dass eine bestimmte Zeit angezeigt wird, so muss man die Zeit sich umrechnen lassen, da der Skript auf Sekunden aufgebaut. Mit einer if-schleife prüft man einfach, ob mindestens ein Wert nicht gleich 0 ist, und falls dies der Fall ist, rechnet man die gesamten Sekunden aus (sprich die Stunden in Sekunden, Minuten in Sekunden und dann diese zwei Werte addieren mit den restlichen Sekunden).
      Die Minuten kann man dann einfach ausrechnen, indem man die gesamten Sekunden durch 60 dividiert. Das gleiche bei den Stunden, nur das man hier natürlich die Minuten durch 60 dividiert.

      Am Ende des Create Events stellen wir dann noch den Alarm 0 auf eine beliebige Zeit (bei normalen Room_speed (30) entspricht damit dieser Code "alarm[0] = 30;" nacher dies: "1 Sekunde im Spiel, vergeht in Einer echten Sekunde." - Wenn man will das 3 Sekunden im Spiel, in einer echten Sekunde vergeht, muss man "alarm[0] = 10;" eingeben. Allerdings sind bei normalen room_speed 30 Sekunden pro Sekunde das maximum, da man Alarme nicht mit 0, (bzw. im GM 0.) Zahlen angeben kann - will man dies erhöhen muss man den Room_speed erhöhen | Oder man erhöht die Sekündliche addition im Alarm 0).

      Das Create Event sollte nun in etwa so aussehen:
      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. // Die Startstunden, ~minuten, und ~sekunden Einstellen
      3. // (Somit kann man auch eine Uhrzeit simulieren, beispielsweiße
      4. // 14:42:48 - hh = 14; mm = 42; ss = 48;
      5. // Die richtigen Werte errechnet der PC nach der Initialision von selbst!)
      6. hh = 0;
      7. mm = 0;
      8. ss = 0;
      9. // ... mithilfe dieser Code-Zeilen
      10. if (hh != 0 || mm != 0 || ss != 0)
      11. {
      12. ss = ss+(hh*60*60)+(mm*60);
      13. mm = ss/60;
      14. hh = mm/60;
      15. }
      16. // time_spd ist eine public Variable, die die Anzahl der "vergehenten"
      17. // Sekunden pro Sekunde angibt.
      18. // Wobei gilt:
      19. // room_speed/time_spd = x Sekunden pro Sekunde
      20. time_spd = 1;
      21. alarm[0] = time_spd;
      22. }
      Alles anzeigen


      Nun erstellen wir das Alarm 0 Event. Hier wird einfach immer die Sekunden Variable (ss) um eins addiert. Damit die Minuten und die Stunden auch "aktualisiert" werden, rechnet man sie neu aus, einfach mit den im Create Event benutzten Formeln.

      Wir brauchen nur eine if-Schleife, die prüft ob die Stunden größergleich 24 sind - falls dies wahr ist werden nur die Sekunden auf 0 zurückgesetzt (da die Minuten und Stunden ja Sekunden abhängig sind).

      Und nun wird am Ende des Alarms einfach wieder der Alarm 0 aufgerufen, am besten mit der verwendeten Geschwindigkeit aus dem Create Event.

      Der Code könnte nun so aussehen:
      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. // Hier wird beim Aufrufen des Alarm's 0 zur Sekunden-Variable "ss"
      3. // 1 dazu addiert.
      4. ss += 1;
      5. mm = ss/60;
      6. hh = mm/60;
      7. // Da die Stunden und Minuten an den Sekunden gekoppelt sind, brauchen
      8. // wir nur die Sekunden zurücksetzten.
      9. if (hh >= 24)
      10. ss = 0;
      11. // Den Timer für den Alarm 0 neu setzten, mit der Geschwindigkeit
      12. // time_spd (room_speed/time_spd = x Sekunden pro Sekunde)
      13. alarm[0] = time_spd;
      14. }
      Alles anzeigen


      Im Draw Event des Objektes müssen wir nur noch meinen Vorgefertigten Skript anwenden, und die Argumente richtig übergeben.
      Der Code sollte so aussehen:

      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. draw_uhr(x,y,30,hh,mm,ss,c_red,c_green,c_blue,c_gray,c_white,1);
      3. // draw_uhr(xpos,ypos,rad,hh,mm,ss,col_hh,col_mm,col_ss,col_br,back_c,alpha);
      4. }


      4. Fertig!
      Nur noch das Objekt irgendwo im Raum erstellen, und das "Spiel" starten. Die Uhr sollte nun Funktionieren :)
      Ich hänge nochmal eine Example gmk am Dateianhang ran. Viel spaß damit ^^

      Mfg.,
      Metalknight

      Edit1: Edit oben unter 1. Geschrieben
      Edit2: "Edit:" zu den Edit 1. geschrieben
      Edit3: Den Fehler von Edit1 auch im zweiten Code ("draw_pointer") verbesserert.
      Dateien
      • draw_uhr.rar

        (13,6 kB, 263 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Metalknight ()

    • Habs getestet und hat alles geklappt.
      Man müsste es nur noch schöner gestallten aber das ist hier ja egal ^^
      Mein Aktuelles und auch einziges Projekt ist "The Color of Life"
      Es wird ein Rollenspiel! Eine lange Story die auch gut ist. Das umzusetzen dauert eben bis 2011!
      Freue mich über jede Hilfe die ich bekommen kann. ^^
      Bald GM8 :thumbsup: wird der hammer xD
    • KröteGAMES schrieb:

      Währe nur besser, wenn er die Aktuelle Uhrzeit anzeigen würde :D !
      Das geht doch ;)!
      Ganz einfach im Create Event des Objektes die "Zeit"-Variablen mit current_~ init. ^^

      GML-Quellcode

      1. // [...]
      2. hh = current_hour;
      3. mm = current_minute;
      4. ss = current_second;
      5. // [...]


      Dann musst du nur noch en time_spd auf 30 oder (fallst du verschiedene room_speeds benutzte) auf room_speed stellen.
      Das Create Event sieht dann also insgesamt so aus ^^

      GML-Quellcode

      1. {
      2. // Die Startstunden, ~minuten, und ~sekunden Einstellen
      3. // (Somit kann man auch eine Uhrzeit simulieren, beispielsweiße
      4. // 14:42:48 - hh = 14; mm = 42; ss = 48;
      5. // Die richtigen Werte errechnet der PC nach der Initialision von selbst!)
      6. hh = current_hour;
      7. mm = current_minute;
      8. ss = current_second;
      9. // ... mithilfe dieser Code-Zeilen
      10. if (hh != 0 || mm != 0 || ss != 0)
      11. {
      12. ss = ss+(hh*60*60)+(mm*60);
      13. mm = ss/60;
      14. hh = mm/60;
      15. }
      16. // time_spd ist eine public Variable, die die Anzahl der "vergehenten"
      17. // Sekunden pro Sekunde angibt.
      18. // Wobei gilt:
      19. // room_speed/time_spd = x Sekunden pro Sekunde
      20. time_spd = room_speed;
      21. alarm[0] = time_spd;
      22. }
      Alles anzeigen


      Mfg.,
      Metalknight
    • Oder du setzt hh, mm und ss alle sekunde auf die Computerzeit =S
      So far, Schattenphoenix~
      _____________________________________________________________________________
      "Who needs a stairway to heaven...
      If there is an elevator to hell... ?
      "
      - Vergessen
      "Auch ein perfektes Chaos ist etwas vollkommenes."
      - Jean Genet