Automatische Updates
Wer etwas lesefaul ist, kann gleich zum vierten Punkt springen: Was muss man tun?
Wer ganz lesefaul ist, klaut einfach meinen Code aus dem Example da unten :D
1. Wieso dieses Tutorial?
Zum einen wurde eine Frage dazu vor ein zwei Monaten gestellt. Zum anderen, kennt wohl jeder dieses System und Gamer haben sich auch daran gewöhnt da es ein Großteil der seriösen Spiele-Hersteller nutzen.
In neuster Zeit gilt dies auch nicht mehr nur für große Vollpreis-Spiele sondern auch für jede App aus Appstores, sei es auf Android, iOS oder Windows Mobile.
Also stellte sich auch mir die Frage wieso dies nicht auch in Game Maker Spielen öfters verwendet sein sollte.
Persönlich kenne ich nur eine kleine Handvoll Game Maker Programme dies auch tatsächlich anwenden. Da ich aber irgendwann auch ein Spiel mit diesem Feature veröffentlichen will, habe ich mal meine Entwicklungsarbeit hier in Form dieses Tutorials zusammengefasst.
2. Worum genau geht es hier?
Automatisches Update bedeutet dass der User der Software weder sich selbstständig darum kümmern muss, zu erfahren wann eine neue Version (sprich: Update) verfügbar ist, noch dass er selbst alles neu herunterladen, speichern und starten muss.
Diese drei Prozesse zu automatisieren, erleichtert nicht nur dem User das Leben (wodurch er auch mehr gewillt sein sollte, das Spiel/Programm weiterhin zu verwenden) sondern auch das des Entwicklers.
3. Was braucht man?
- Game Maker Standard (bzw. Pro) Ich kann’s leider nur mit 8.1 testen, 7 und 8.0 sollten aber auf alle Fälle auch gehen.
- Eine Http-Dll oder -Extension. Es gibt da verschiedene wobei auf jeden Fall Bl@ckSp@rk's Exemplar ganz gut ist (GEX GM HTTP (Version 1.0.0.1)). Im Grunde ist aber jede DLL/Extension nutzbar die Dateien herunterladen kann.
- Erste GML-Kenntnisse
- Ein Direktlink-fähiger Server.
Dies kann ein gratis oder kostenpflichtiger Web-Server sein, wobei die gratis-Varianten allein für diesen Zweck nicht zu empfehlen sind da sie meist eine Homepage fordern und man sonst riskiert dass der Account geschlossen wird.
Die beste Alternative ist ein Cloud-Dienst wie Dropbox. Sie sind erstaunlich liberal was massenhafte downloads angeht (20 Gb pro Tag).
Vorteilhaftes (aber nicht notwendiges) Wissen wenn man das System (später) erweitern will: Grundlegende Php- Html- und BATCH - Kenntnisse
4. Was muss man tun?
HINWEIS: Die folgende Abschnitte enthalten keinen Code da man so etwas wie das automatische Update sowieso an seinem Spiel anpassen will bzw. muss. Wer eine zusätzliche Hilfestellung ansehen will, kann aber gerne die angehängte Datei herunterladen.
Auf dem Server
Zunächst muss das Programm erstmal wissen ob ein neues Update verfügbar ist oder nicht. Die wohl komfortabelste Möglichkeit dies zu erreichen, ist indem man eine simple Datei herunterlädt die vom Entwickler erstellt wurde. Diese Datei muss dieser natürlich immer anpassen sobald er eine neue Version veröffentlicht (dies lässt sich auch automatisieren, dazu später mehr).
Befassen wir uns zunächst mal mit der Server-Seite. Die Datei die später vom Spiel heruntergeladen wird kann eine beliebige Endung haben (z.B. .txt oder .html) muss aber auf jedenfall die folgenden 3 Elemente enthalten. Um sie auseinander halten zu können, sollte man einen Separator verwenden, also ein Zeichen das sonst nirgends vorkommt.
- Versionsnummer
Dies gibt an ob ein Update verfügbar ist oder nicht. Einfach ein Ja oder Nein reinzuschreiben, ist nicht zu empfehlen da sonst bei jedem Start des Programms, das Update erneut angewendet wird.
Stattdessen sollte man im Spiel eine Art Versionsnummer verwenden, also einfach eine Variable die irgendwo ganz am Anfang des Spiels gesetzt wird (vielleicht als Konstante, da diese immer gesetzt werden bevor irgendwas anderes im Spiel geschieht).
Hinweis: Diese Versionsnummer muss unbedingt eine echte Zahl sein, also nicht z.B. „v1.2.055“ sondern eher 12055.
- Link zum Programm/Spiel
Um so flexibel wie möglich zu sein, sollte man außer der Versionsnummer auch den Downloadlink in die Datei speichern damit man nicht immer die Dateien seines Programmes unter dem Selben Namen und am selben Ort hosten muss.
Achtung! Keine https-links (wie die automatischen öffentl. Links von DropBox) benutzen da Bl@ckSp@rk's Dll diese nicht unterstützt. Lösung: Einfach das 's' weglassen.
- Versions-Informationen
Natürlich will man dem User auch eine Übersicht darüber geben was sich in der neuen Version geändert hat. Ein entsprechender Text sollte sich ebenfalls in der .txt Datei vorhanden sein.
Im Endeffekt kann die Datei in etwa so aussehen:
12001|]http://dl.dropbox.com/u/69344499/The-Game.exe|Version 1.2.001: - Neues Schieß-System
- 2 Neue Gegner
Im Programm
Um im Game Maker auf solch eine Datei zuzugreifen die man dann auf seinen Server/Dropbox-account/etc hochgeladen hat, benötigt man jedoch eine DLL oder Extension wie die mehrfach erwähnte.
Das Example für gm6 benutzt die DLL Variante während die andere, die Extension-Variante verwendet (die Funktionen sind aber identisch).
Die Suche nach Updates sollte am besten gleich am Anfang des Spiels stattfinden, von daher erstellen wir mal ein Objekt, in dessen create- oder game-start Event wir alles behandeln.
Die Downloads funktionieren je nach Dll etwas unterschiedlich. Das Prinzip und die übergebenen Parameter sind aber meist die selben. In der Datei weiter unten habe ich den Code vollständig komentiert.
Wenn der Download erfolgreich war, befindet sich der Text aus der Datei, in einer Variablen z.B. namens „data“. Diesen Text müssen wir nun auseinandernehmen um die drei Informationsblöcke zu erhalten. Dazu gibt’s ein fertiges Skript von Copyboy das sich ebenfalls in der Datei befindet.
Der erste Block kann mittles der Funktion real() in eine Zahl umgewandelt werden. Ist diese Zahl wiederum größer als die Versionsnummer des aktuellen Spiels, dann bedeutet es dass ein Update vorhanden ist welches heruntergeladen werden kann.
Bevor man nun ans Runterladen des eigentlichen Spiels gehen kann, sollte man immer dem User erstmal zeigen dass es ein Update gibt. Wie ihr das macht, bleibt natürlich euch überlassen. Im Beispiel ist es eine einfache message die auch die Änderungen (aus dem dritten Block) beinhaltet.
Als nächstes sollte die neue Datei heruntergeladen werden. Dazu besitz die http dll ebenfalls einige Funktionen (siehe Datei).
Der Download sollte in einen separaten Ordner stattfinden, damit es keine Namensprobleme gibt.
Das Beispiel hier bezieht sich nur auf ein Spiel das nur aus einer EXE besteht. Meistens hat man aber zusätzliche Dateien die man in ein ZIP Archiv gepackt hat. Kein Problem, ZIP-Archieve kann man auch mittels einer DLL öffnen. Man entpackt dann die Dateien einfach in den Unterordner nachdem das Archiv heruntergeladen wurde.
Die BAT-Datei
Als nächstes muss die neue Version des Programms die alte Version ersetzen und genau da stößt man auf ein Problem. Ein, mit dem Game Maker erstelltes, Programm kann sich nicht selbst überschreiben oder löschen solange es noch läuft.
Ein Möglichkeit wäre es, extra für diesen Zweck eine zweite EXE Datei dem Programm beizufügen die nur beim Updaten zum Einsatz kommt und – vom (alten) Programm gestartet – die alten Dateien des Programms löscht und dann die neuen herüber kopiert.
Die Exe-Dateien vom Game Maker sind aber über 4 MB groß. Meiner Meinung nach, einfach nur Speicherverschwendung sie für diesen Zweck zu nutzen. Zudem muss man wohl auch dafür einiges an Code schreiben.
Viel einfacher geht das mit einem Windows-internen Mittel (welches eigentlich aus DOS-Zeiten stammt), dem so genannten Batch. Sicher habt ihr ab und an bei Programmen Dateien beiliegen sehen die die Endung .bat hatten. Diese Dateien enthalten meist genau solchen Code.
Dabei wird weder ein Runner noch einen Compiler benötigt, da Windows selbst diese Dateien ausführen kann.
Zudem ist das was wir brauchen auch mit sehr wenig Befehlen zu realisieren.
Ein Batch-Befehl besteht immer aus einem Befehlswort sowie Argumenten dahinter. Ein großer (und meiner Meinung nach, ziemlich störender) Unterschied zur Syntax von GM-Funktionen, ist dabei dass die Argumente nicht von Klammern umschlossen sind und durch Leerzeichen und nicht Komata getrennt sind!
Die Datei sollte als Minimum aus folgenden Zeilen/Befehlen bestehen:
ping 127.0.0.1 -n 2 >nul
Der Game Maker wird wohl immer einige Millisekunden brauchen bevor er sich beendet, selbst wenn man game_end() direkt nach dem starten der Bat-Datei aufruft. Zudem hat man oft noch gewisse andere Dinge die vor dem Beenden ausgeführt werden müssen, wie das Freigeben von Surfaces oder DLLs, die Zeit kosten.
Leider gibt es keine sleep() Funktion oder ähnliches in Batch, aber man kann sich mit der „Ping“ Funktion behelfen (Falls jemand eine komfortablere Lösung hat wie man die Ausführung für einen kurzen Zeitraum unterbrechen kann, wäre es toll wenn er sie mir mitteilt).
xcopy "PFAD\new_ver\*.*" "PFAD" /D /E /Y
Diese Funktion kopiert den Inhalt vom erstellten download-Ordner in das Hauptverzeichnis des Spiels. /D bewirkt dass nur Dateien kopiert werden die tatsächlich geändert wurden (ein späteres Änderungsdatum haben) und /E sorgt dafür dass auch Unterordner miteinbezogen werden. Zuletzt bewirkt /Y noch dass der User nicht zur Bestätigung aufgefordert wird.
rd /S /Q "PFAD\new_ver"
Löscht den gesamten Download-Ordner.
start "" "PFAD\The-Game.exe"
Führt das neue Programm aus.
del %0
Diese erstaunlich kurze Zeile löscht die Bat-Datei selber, so dass man keinen Mechanismus braucht der dies erledigt.
Und damit ist die Arbeit im Grunde getan.
5. Diverse Hinweise und Tipps:
- Alle Dateipfade in der Bat - Datei müssen undedingt in “ – Zeichen eingeschlossen werden damit Leerzeichen im Pfad behandelt werden können! Dazu habe ich einen, etwas unübersichtlichen Code geschrieben. Man könnte dies mit mehr Variablen anders gestalten.
- EDIT:[Um die bat-Datei auszuführen habe ich noch dieses Script geschrieben: copy's nützliche Scripte Damit erscheint das cmd-Fenster nicht und man stört den User nicht.]
- Das heruntergeladene Update des Programms muss nicht zwangsläufig die ganze Software samt Unterverzeichnisse beinhalten. Oftmals reicht es nur die .exe Date zu ersetzen oder auch nur andere ressourcen. Dies spart viel Download-Zeit ein. Das Updating-System selbst muss dazu nicht angepasst werden.
- Man kann all dies um viele Dinge erweitern. Eine Möglichkeit wäre es in der Informations-Datei die man am Anfang runterlädt auch gleich den Text der .bat – Datei zu speichern damit man als Entwickler auch gewisse Änderungen bzw. Erweiterungen vornehmen kann. Dies ist zum Beispiel nützlich wenn man Dateien auf dem Rechner der User nicht mehr braucht. Batch - Wissen ist dazu ganz praktisch. Den Pfad muss man dann aber im Game Maker Teil gezielt einfügen (dazu am besten ein codewort wie PFAD nehmen und im GM ersetzen lassen).
- Als Entwickler kann man auch andere hilfreiche Dinge aus diesem System entwickeln indem man statt der .txt Datei, ein PHP – Dokument benutzt (dazu ist aber ein PHP-Fähiger Server zwingend erforderlich da DropBox kein Php interpretiert).
So könnte man sich ein Skript schreiben das z.B. Statistiken über die Zahl der updatenden User aufnimmt oder man schreibt eines mit dem man im Browser eine neue Version des Programms veröffentlichen kann ohne FTP benutzen zu müssen… (Wenn ein Php-Skript heruntergeladen wird, kommen nur die Daten an die durch den Php-Befehl "echo" ausgegeben wurden. Damit kann man die Mechanismen verstecken.)
Wie sagt man so schön? Die Möglichkeiten sind grenzenlos! ;)
Hier, zum Testen, ein Beispiel als .EXE - Datei: the-game.zip (Denkt dran sie zuerst entpacken!)
Enthalten ist nur die Datei der „alten“ Version. Das Updating System ist aber über meinen Drop-Box Account eingerichtet, alsooo…
Hoffe das funzt bei jedem (die upgedatete Version muss die Zahl 2 in Rot zeigen)!
Die angehängten Dateien sind ebenfalls die Dateien der ersten Version. Die version auf die im .exe - Example geupdatet wird, ist aber genau identisch bis auf die Versionsummer.
Hiermit bedanke ich mich herzlichst bei jeden der sich die Mühe gemacht hat, dieses zugegebenermaßen, sehr lange Tutorial, durchzulesen. Hoffe es hatte einen Nutzen für euch und dass die Rechtschreibfehler nicht zu schlimm waren

Bei Rückfragen stehe ich sehr gerne zur Verfügung.
Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von DragonGamer ()