Automatische Updates

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

    • Automatische Updates

      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.

      1. 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.

      2. 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.

      3. 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. Das einzige was noch fehlt ist eine Abfrage im Programm die gegebenenfalls eine existente update.bat - Datei löscht da auch .bat - Dateien sich nicht selbst löschen können. Edit: Anscheinend geht das doch. Hab die Zeile hier hinzugefügt.



      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 :D
      Bei Rückfragen stehe ich sehr gerne zur Verfügung.
      Dateien

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

      Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von DragonGamer ()

    • Sehr gutes Tutorial! Sicherlich hilfreich, habe vorhin gerade mein eigenes System fertiggestellt!

      Evtl. könnte man die BATCH-Files weglassen, da der Game Maker ähnliche, integrierte Möglichkeiten bietet.

      Zum ausführen einer Datei execute_shell() oder execute_program().
      Zum kopieren von Dateien file_copy()
      Zum löschen von Dateien file_delete()
      etc...

      Oder man könnte die BATCH-Dateien dynamisch generieren mit Scripts, file_* und argument[0...18] :whistling:


      Aber alles in allem ein gutes Tutorial, ein gutes System, ausreichende Sicherheit! BRAVO!

      €dit:

      DragonGamer schrieb:

      Kein Programm kann sich selbst überschreiben oder löschen solange es noch läuft.


      Noch was zu dem; Genau diese Stelle kann ja der Updater übernehmen...
      :thumbsup:
    • Wovon genau redest du?
      Wie oben geschrieben, kann sich kein Programm selbst löschen oder überschreiben! Und extra deswegen seinem Spiel ein weiteres 4 MB großes GM-Programm anzuhängen halte ich für ziemlich sinnlos.

      Aber großes Dank für den Lob! ;)


      EDIT:
      Noch was zu dem; Genau diese Stelle kann ja der Updater übernehmen...

      Naja, wie willst du das anstellen? Man kann die neue Version ja kaum in den selben Ordner herunterladen wie die Version die grad runterlädt. Das würde dann bedeuten dass bei jedem Update, ein neuer Unterordner gemacht werden muss... oder dass alle Dateien einer neuen Version einen neuen Namen bekommen haben mussen --> Zuviele Fehlerquellen, wenn du mich fragst.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Naja, sagen wir, game.exe lädt updater.exe herunter. game.exe führt updater.exe nach Download aus, und beendet sich dabei selbst --> game_end().
      updater.exe löscht alte version und kopiert die neue version (die z.B. in den included files liegt) in den richtigen ordner.

      FERTIG!
      :thumbsup:
    • jlsnews schrieb:

      Naja, sagen wir, game.exe lädt updater.exe herunter. game.exe führt updater.exe nach Download aus, und beendet sich dabei selbst --> game_end().
      updater.exe löscht alte version und kopiert die neue version (die z.B. in den included files liegt) in den richtigen ordner.

      FERTIG!
      Okey, auch ne Möglichkeit.. die aber jedes mal zusätzliche 4 MB downloaden muss xP


      EDIT: Durch ein YouTube Video habe ich rausgefunden dass es doch eine Methode gibt .Bat Dateien von sich aus und automatisch zu löschen. Habe sie oben als eine weitere Befehlszeile eingefügt.
      Außerdem hat mich CAS drauf aufmerksam gemacht dass sowas auch in C geht. Von daher stimmt meine Aussage über selbstlöschbare Programme nicht im Allgemeinen.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DragonGamer ()

    • Sehr hilfreiches Tutorial!

      Auch ich habe vor kurzem mein eigenes Update-System fertiggestellt,
      allerdings lädt meine Version eine Überprüfungs-Textdatei mit der Versionsnummer der aktuellen Version herunter und vergleicht die mit der Versionsnummernvariable im Spiel, und heruntergeladen wird immer eine .rar-Datei.^^ Was natürlich den Nachteil hat, dass man die .rar-Datei ja nicht automatisch mit dem Gamemaker entpacken kann, oder geht das auf irgendeine Art und Weise?

      Und selbst wenn, kann ich den Inhalt ja nicht überschreiben solange das Spiel läuft, wie im Tutorial ja auch beschrieben. Also kommt mir das mit den .bat-Dateien gerade sehr gelegen. :)
    • Was ist denn los in diesen Tagen? jeder hat sich neulichst schon damit beschäftigt.. auf der GMC wurde auch ein Skript dazu wiederausgegraben o-o

      Freue mich sehr dass du mein Tutorial für hilfreich erachtest!

      Nur mit dem GM kann man zip oder rar Archive meines Wissens nach, nicht öffnen. Aber es gibt gleich mehrere Dll's bzw. Extensions mit denen das absolut fix geht :)
      Damit kann man auch gleich komplexere (und auch verschlüsselte) Karten erstellen und ähnliches.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Hallo,

      Ich hab eine frage das ich nicht ganz begriffen habe.

      Es gibt doch einen (Client) dort mein Spiel + der Automatische Update vorhanden ist. Sagen wir mal jeder Spielt das Spiel.. Nach einer weille mache ich ein eine andere version, und will die Automatische Update haben damit die Users das sehen. Wo muss ich dann gehen? Wieder auf die (Client-gmk) Update schreiben schließen? Das geht doch nicht.

      UND braucht man dafür keinen Server, weil ich keine Ports öffne oder muss ich doch ports öffnen?
    • kaano123 schrieb:

      UND braucht man dafür keinen Server, weil ich keine Ports öffne oder muss ich doch ports öffnen?
      Nein! Das ganze funktioniert übers Internet. Daher auch die http-Dll/Gex.
      Hast du dir das Tutorial denn durchgelesen?

      Du brauchst einen Filehoster(z.B. Dropbox) oder Server auf dem die Daten sind, d.h. die Datei des aktuellen Spiel-Standes sowie eine .txt Datei die eben die Informationen enthält - siehe das Beispiel im Tutorial.


      kaano123 schrieb:

      Es gibt doch einen (Client) dort mein Spiel + der Automatische Update vorhanden ist. Sagen wir mal jeder Spielt das Spiel.. Nach einer weille mache ich ein eine andere version, und will die Automatische Update haben damit die Users das sehen. Wo muss ich dann gehen? Wieder auf die (Client-gmk) Update schreiben schließen? Das geht doch nicht.
      Ähh so ganz verstehe ich deine Frage nicht...
      Du musst nichts in die GMK schreiben.

      Wenn eine neue Version kommt musst du ausschließlich die .txt Datei auf deinem filehoster/server ändern (wie im Tutorial beschrieben) und einfach die neue Version hochladen.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DragonGamer ()

    • SkaillZ schrieb:

      Ist zwar schon ein altes Topic, aber noch eine Frage dazu: Kann man i-wie verhindern, dass das Fenster einfriert, wenn man während dem Download hinein klickt?
      Ja. Die Http-Dll die zum Downloaden verwendet wird ist unabhängig vom GM.
      In dem beispiel Projekt steht dieser Code:

      GML-Quellcode

      1. draw_set_color(c_red);
      2. screen_redraw();
      3. while(http_request_get_performing(req))
      4. {
      5. f = http_request_get_down_current(req)/max_size; // Heruntergeladener Anteil
      6. draw_rectangle(10,10,10 + f*(room_width-20),30,0);
      7. screen_refresh();
      8. }
      Es besteht aus einer while schleife die die ganze Zeit abfragt ob "http_request_get_performing(req)" positiv ist. Diese Funktion ist so lange positiv wie der download läuft.
      D.h. wennd as Spiel weiterlaufen soll während heruntergeladen wird, musst du nur diese while Schleife entfernen und dann z.B. in einem Step event diese Funktion abfragen. Ergibt diese nicht mehr positiv, wird dann alles weitere ausgeführt (das was in dem Beispielprojekt hinter dieser Schleife steht).

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • derkimba schrieb:

      Bei mir hängt es sich immer auf, wenn er überprüfen will ob eine neue Version verfügbar ist, man aber keine Internet Verbindung hat
      Seltsam... eigentlich sollte da eine exception geworfen werden:

      GML-Quellcode

      1. if !http_request_get_successful(req)
      2. {
      3. show_message("Etwas ist schief gelaufen! Eventuell hast du keine Internetverbindung!");
      4. // Falls der download einen Fehler aufgeworfen hat...
      5. http_request_destroy(req); exit;
      6. // Speicher freigeben und Updating beenden
      7. }
      Die DLL gibt es normalerweise durch diese FUnktion aus wenn keine Verbindung hergestellt werden konnte...
      Wenn das nicht zuverlässig funktioniert, kann ich da leider nicht viel mehr machen :/

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Das prinzip schon, aber in Studio sollte man dlls ja nicht verwenden, ebensowenig wie batch dateien, da beides von Windows abhaengt.
      Aber mit einigen Anpassungen muesste es moeglich sein!

      Bedenke allerdings auch dass das Dateisystem beim Studio anders funktioniert...

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)