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
Spoiler 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
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
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:
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.
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
draw_uhr
Alles anzeigen
GML-Quellcode
- {
- // draw_uhr(xpos,ypos,rad,hh,mm,ss,col_hh,col_mm,col_ss,col_br,back_c,alpha);
- // ====================================================================================
- // Copyright Pascal 'Metalknight' Piduhn 2009 | Kontakt: MSN | E-mail
- // Credits wäre nett, ist aber kein muss ;) | metalknight2009@live.de
- // ====================================================================================
- // 1. Argumente in den entsprechnenen lokalen (!) Variablen speichern
- var xpos, ypos, rad, hh, mm, ss, col_hh, col_mm, col_ss, col_br, back_c;
- xpos = argument0; // X-Position der Uhr
- ypos = argument1; // Y-Position der Uhr
- rad = max(25,argument2); // Radius (25<) der Uhr (äußerster Radius!!!)
- hh = argument3; // Stunden-Zeiger der Uhr
- mm = argument4; // Minuten-Zeiger der Uhr
- ss = argument5; // Sekunden-Zeiger der Uhr
- col_hh = argument6; // Farbe des Stunden Zeigers der Uhr
- col_mm = argument7; // Farbe des Minuten Zeigers der Uhr
- col_ss = argument8; // Farbe des Sekunden Zeigers der Uhr
- col_br = argument9; // Farbe des Rands der Uhr
- back_c = argument10; // Farbe des Hintergrunds der Uhr
- alpha = argument11; // Der Alpha-Wert der Uhr (Die Pfeile sind in einen
- // extra Skript (draw_pointer) und haben einen festen Alpha-Wert (1|100%)!)
- // Hier werden, bevor wir die Werte verändern, der Farb- und Alphawert gespeichert
- // um diese nach ausführen des Skripts zurückzusetzten.
- var o_alpha, o_col;
- o_alpha = draw_get_alpha();
- o_col = draw_get_color();
- // 2.1 Grundgerüst der Uhr zeichnen
- draw_set_alpha(alpha);
- draw_set_color(back_c);
- draw_circle(xpos,ypos,rad,false);
- draw_set_color(col_br);
- draw_circle(xpos,ypos,rad,true);
- // 2.2 Die typisch, schwarze Striche Zeichen (bei 0,3,6,9 Uhr)
- /// Achtung: Die Striche werden hier mit der col_br Farbe gezeichnet, da ich dies
- /// für besser halte (was nicht heißt, dass man dies nicht ändern könnte)
- draw_line(xpos,ypos-rad*0.3,xpos,ypos-rad*0.7); // 0 Uhr
- draw_line(xpos+rad*0.3,ypos,xpos+rad*0.7,ypos); // 3 Uhr
- draw_line(xpos,ypos+rad*0.3,xpos,ypos+rad*0.7); // 6 Uhr
- draw_line(xpos-rad*0.3,ypos,xpos-rad*0.7,ypos); // 9 Uhr
- // 3. Einzeichnen der Zeiger (hh:mm:ss)
- /// Mithilfe meines draw_pointer Skriptes, und dem Sprites "s_pointer" werden die Zeiger
- /// ganz Einfach gezeichnet.
- draw_pointer(xpos,ypos,rad*0.6,hh,col_hh,12);
- // draw_pointer(xpos,ypos,rad,tt,col,format);
- draw_pointer(xpos,ypos,rad*0.8,mm,col_mm,60);
- // draw_pointer(xpos,ypos,rad,tt,col,format);
- draw_pointer(xpos,ypos,rad,ss,col_ss,60);
- // draw_pointer(xpos,ypos,rad,tt,col,format);
- // 4. "Outro"
- /// Den Alpha- und Farbwert zurücksetzten, auf die vor dem Skript benutzten Einstellungen
- draw_set_color(o_col);
- draw_set_alpha(o_alpha);
- }
draw_pointer
Alles anzeigen
GML-Quellcode
- {
- // draw_pointer(xpos,ypos,rad,tt,col,format);
- // ====================================================================================
- // Copyright Pascal 'Metalknight' Piduhn 2009 | Kontakt: MSN | E-mail
- // Credits wäre nett, ist aber kein muss ;) | metalknight2009@live.de
- // ====================================================================================
- // 1. Argumente in den entsprechnenen lokalen (!) Variablen speichern
- var xpos, ypos, rad, tt, col, format;
- xpos = argument0; // Die X-Position des Zeigers
- ypos = argument1; // Die Y-Position des Zeigers
- rad = argument2; // Der Radius, des Zeigers, in dem er sich drehen soll
- tt = argument3; // Die Zeit, die der Zeiger darstellen soll
- col = argument4; // Die Farbe, die der Zeiger haben soll
- format = argument5; // Das Format der Zeit (bspl.: Sekunden -> 60, Stunden -> 12)
- // 2. Der Zeiger wird mit Hilfe eines 1x1 (px) großen Sprites gezeichnet
- /// (!)ACHTUNG: Das Sprite sollte weiß sein und man muss das
- /// Häckschen bei "Transparent" weg machen(!)
- draw_sprite_ext(s_pointer,0,xpos,ypos,1,-(rad*0.8),-(360/format*tt),col,1);
- }
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:
GML-Quellcode
- {
- // Die Startstunden, ~minuten, und ~sekunden Einstellen
- // (Somit kann man auch eine Uhrzeit simulieren, beispielsweiße
- // 14:42:48 - hh = 14; mm = 42; ss = 48;
- // Die richtigen Werte errechnet der PC nach der Initialision von selbst!)
- hh = 0;
- mm = 0;
- ss = 0;
- // ... mithilfe dieser Code-Zeilen
- if (hh != 0 || mm != 0 || ss != 0)
- {
- ss = ss+(hh*60*60)+(mm*60);
- mm = ss/60;
- hh = mm/60;
- }
- // time_spd ist eine public Variable, die die Anzahl der "vergehenten"
- // Sekunden pro Sekunde angibt.
- // Wobei gilt:
- // room_speed/time_spd = x Sekunden pro Sekunde
- time_spd = 1;
- alarm[0] = time_spd;
- }
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:
GML-Quellcode
- {
- // Hier wird beim Aufrufen des Alarm's 0 zur Sekunden-Variable "ss"
- // 1 dazu addiert.
- ss += 1;
- mm = ss/60;
- hh = mm/60;
- // Da die Stunden und Minuten an den Sekunden gekoppelt sind, brauchen
- // wir nur die Sekunden zurücksetzten.
- if (hh >= 24)
- ss = 0;
- // Den Timer für den Alarm 0 neu setzten, mit der Geschwindigkeit
- // time_spd (room_speed/time_spd = x Sekunden pro Sekunde)
- alarm[0] = time_spd;
- }
Im Draw Event des Objektes müssen wir nur noch meinen Vorgefertigten Skript anwenden, und die Argumente richtig übergeben.
Der Code sollte so aussehen:
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.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Metalknight ()