Hallo,
Ich habe ein Spiel in Pygame geschrieben und möchte einen Level-Editor als 2tes Programm schreiben. Ich möchte aber nicht, dass der Level-Editor Teil des Spieles ist sondern ein separates Program. Anfänglich hatte ich die Levels in einem Yaml-file dargestellt, dass dann zur Laufzeit ausgelesen wird - d.h. Level-Editor (A) ändert Yaml-File (B) dass dann von Game (C) ausgelesen wird. Nun möchte ich aber auf dieses Zwischenschritt (B) verzichten können so dass ich direkt von (A) die Levels in (C) ändern kann. Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann. Darum will ich die Levels jetzt in einem String im Spiel (C) "hart rein coden". Nur verstehe ich nicht ganz, wie ich diese nachträglich ändern kann, da das Spiel (C) ja schon kompiliert ist. Müsste ich hierzu das Spiel wieder disassemblieren und dann die entsprechende Variable überschreiben bzw. ersetzen, oder gibt es da eine wesentlich simplere Variante? Ich bin sonst ratlos wie man so etwas realisieren soll.
Und falls es keinen anderen Weg gibt, kann ich mittels eines Modules auch eine mit py2exe erstellte Exe-Datei wieder in halbwegs lesbaren Python-Code zurückverwandeln?
Ich hoffe, ihr versteht mein Problem.
Mit Python zugriff auf ein kompiliertes Pythonprogram
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hier kann ich nur fragen: Warum? Damit machst Du Dir das Leben imho unnötig schwierig!DKKA hat geschrieben:Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann.
Du kannst natürlich die Leveldaten direkt in ein Python-Modul schreiben - aber dann wird das Bearbeiten irgend wie deutlich aufwendiger... und wieso sollte man Code und Daten mischen wollen?
Zur Not kannst Du doch auch ein Archiv erstellen und das als Zip-File mitliefern; du hättest dann eben nicht 100 YAML-Files, sondern nur ein Zip-Archiv. Wäre das nicht ggf. ein Kompromiss?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Hm, wie meinst du die Leveldaten direkt in ein Python-Modul schreiben? Einfach ein neues Py-File erstellen, dass nur die Levels enthält und das dann importieren?Hyperion hat geschrieben:Hier kann ich nur fragen: Warum? Damit machst Du Dir das Leben imho unnötig schwierig!DKKA hat geschrieben:Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann.
Du kannst natürlich die Leveldaten direkt in ein Python-Modul schreiben - aber dann wird das Bearbeiten irgend wie deutlich aufwendiger... und wieso sollte man Code und Daten mischen wollen?
Zur Not kannst Du doch auch ein Archiv erstellen und das als Zip-File mitliefern; du hättest dann eben nicht 100 YAML-Files, sondern nur ein Zip-Archiv. Wäre das nicht ggf. ein Kompromiss?
Ich weiss, es ist nicht wirklich eine Python-Fragen, aber gibt es eine Möglichkeit wie ich die Yaml-Levelfiles irgendwie in die .Exe verpacken kann und auch wieder darauf zurück greifen kann um sie zu ändern? Ich möchte natürlich das Spiel mit py2exe als .Exe umwandeln und ich finds halt schöner, wenn ich nur ein File habe. Ausserdem möchte ich halt, dass man die Files mit dem Leveleditor ändern soll und das man nicht einfach das Yamlfile öffnen kann und schnell mit txt-editor ändern kann. Sonst wäre mein Leveleditor für die Katze und es würde zudem viel Fehleranfälliger werden.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja! Oder eben ein bestehendes...DKKA hat geschrieben: Hm, wie meinst du die Leveldaten direkt in ein Python-Modul schreiben? Einfach ein neues Py-File erstellen, dass nur die Levels enthält und das dann importieren?
Das ist imho albernDKKA hat geschrieben: Ausserdem möchte ich halt, dass man die Files mit dem Leveleditor ändern soll und das man nicht einfach das Yamlfile öffnen kann und schnell mit txt-editor ändern kann. Sonst wäre mein Leveleditor für die Katze und es würde zudem viel Fehleranfälliger werden.
Du kannst Deine Leveldaten ja auch im Netz platzieren; das Programm läd sie sich beim Starten einfach runter... ich finde dennoch sonderbar, sich so viele künstliche Probleme zu schaffen. Freu Dich doch lieber, wenn viele Leute Dein Spiel zocken - da ist es doch egal, was für ein Tool sie zum Bauen von Leveln nutzen... :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Das ist kein Antipattern. Das ist einfach Mist.
Da will man lediglich einen winzigen Aspekt im Level ändern und muss gleich das komplette Programm nebst dazugehörigen Interpreter, Modulen und ggf. DLL neu packen und ausliefern?
Nimm Dir einen Brombeerstrauch und kasteie Dich damit so lange selbst, bis dieser Gedanke aus Deinem Kopf verschwunden ist!
Da will man lediglich einen winzigen Aspekt im Level ändern und muss gleich das komplette Programm nebst dazugehörigen Interpreter, Modulen und ggf. DLL neu packen und ausliefern?
Nimm Dir einen Brombeerstrauch und kasteie Dich damit so lange selbst, bis dieser Gedanke aus Deinem Kopf verschwunden ist!
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
@DKKA: Du willst also mit allen Mitteln verhindern, dass man Dein Spiel spielt, dass man Levels unabhängig vom Programmcode tauschen kann. Falls Dein LevelEditor gut ist, wird niemand die Text-Dateien direkt ändern, falls Dein LevelEditor Schrott ist, sind alle froh, dass sie die Level mit einem Texteditor ändern können.
Ich finds halt schöner, wenn man alles nur als eine Datei hat... Und ich glaube der Leveleditor ist sicherlich besser als das Textfile. Ich verstehe natürlich alle aufgeführten Punkte, aber ich möchte trotzdem noch nachfragen, ist es wirklich so schwer/so viel Arbeit einen einzigen String zu ersetzen? Ich kenne mich mit disassemblieren gar nicht aus, weiss aber, dass es ein dis-modul in Python gibt und ich beherrsche halbwegs die Grundlagen von TASM. Aber natürlich habe ich noch nie so etwas in diese Richtung gemacht. Kenne nur die Register+Flags und die Grundoperationen... Und wäre cool wenn ihr mir vielliecht 1-2 gute links/tutorial zum dis-module geben könnt, das wollte ich mir schon lange mal ansehen. Vielen Dank.Sirius3 hat geschrieben:@DKKA: Du willst also mit allen Mitteln verhindern, dass man Dein Spiel spielt, dass man Levels unabhängig vom Programmcode tauschen kann. Falls Dein LevelEditor gut ist, wird niemand die Text-Dateien direkt ändern, falls Dein LevelEditor Schrott ist, sind alle froh, dass sie die Level mit einem Texteditor ändern können.
@DKKA: Mit dem `dis`-Modul kann man CPython-Bytecode von Code-Objekten in eine lesbare Form bringen. Das hat recht wenig mit TASM und Prozessorregistern zu tun. Und es gibt, zumindest in der Standardbibliothek auch keinen Compiler mit dem man die Ausgabe vom `dis`-Modul wieder in Bytecode verwandeln könnte. Das ist nur dazu da wenn man sich den Bytecode mal anschauen möchte, zum besseren Verständnis was die Laufzeitumgebung da eigentlich ausführt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also eigentlich ist einem User das vollkommen egal! Den interessiert nur, wie *einfach* sich etwas installieren lässt. Willst Du also das einfach gestalten, ok. Dazu braucht es für Windows allerdings lediglich einen guten InstallerDKKA hat geschrieben: Ich finds halt schöner, wenn man alles nur als eine Datei hat...
Naja, dann wird ihn ja auch jeder Interessierte verwenden - und wenn jeman ein Meisterwerk an Level erschafft, ohne Deinen Editor zu verwenden, ist das dann etwa unerwünscht?DKKA hat geschrieben: Und ich glaube der Leveleditor ist sicherlich besser als das Textfile.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert