Spiele veröffentlichen
Re: Spiele veröffentlichen
Das sind alles super interessante Einblicke, großes Lob und vor allem vielen Dank dafür! Aber es ist auch einigermaßen ernüchternd, wenn ich lese, was alles probiert wird, um ein Spiel bekannt zu machen. Es ist frustrierend, wenn man meint, ein ganz tolles Ding gebastelt zu haben - wenn nicht sogar das beste :-) - und es interessiert niemanden. Und nein, ich mache hier jetzt keine Werbung für meine Spiele.
- woodsmoke
- Establishment
- Beiträge: 207
- Registriert: 30.06.2023, 14:05
- Echter Name: Julian
- Kontaktdaten:
Re: Spiele veröffentlichen
Wahre Künstler singen auch wenn niemand zuhört. Man hat einfach das Bedürfnis.
Oh das wusste ich nicht. Ich habe bei itch.io schon 28 Spiel(zeug)e hochgeladen und 11 Zines (kleine Heftchen). Laut FAQ scheint der 20 Limit für neue Accounts zu sein.
Spiele: https://woodsmoke.itch.io/
Videos: https://www.youtube.com/@w00dsm0ke/
Zeichnungen: https://www.deviantart.com/melerski/gallery/all
Videos: https://www.youtube.com/@w00dsm0ke/
Zeichnungen: https://www.deviantart.com/melerski/gallery/all
Re: Spiele veröffentlichen
Ich habe mich jetzt für den Nullsoft Installer entschieden: https://de.wikipedia.org/wiki/Nullsoft_ ... all_System
Install Creator und Install Forge hatte ich beide angeschaut, aber da gingen immer irgendwelche Sachen nicht und am Ende hatte ich keinen Bock mehr.
Was ich jetzt mit NSIS hinbekommen haben:
- Ein Installer, der im wesentlichen eine selbstextrahierendes Archiv ist
- Desktopverknüpfung wird erzeugt
- Keine Admin-Rechte nötig. User/AddData/Roaming/ als Standardpfad (das Spiel schreibt Dateien in sein Installationsverzeichnis, ich brauche also was mit Schreibrechten)
- Startbildschirm mit kurzer Begrüßung
- Installer hat auch auf High DPI keine verwaschenen Texte (sehr geläufiges Problem!)
- Zweisprachig. Standarddialoge sind automatisch übersetzt, Begrüßungsbildschirm ist deutsch + englisch. Sprache wird vom System ermittelt, dort wo ich es bisher getestet habe lief das gut. Im Bezug auf unsere Sprachdiskussion anderswo, geht es hier ja auch nicht um die Lieblingssprache sondern um irgendeine Sprache die der aktuelle Nutzer versteht. Im Zweifelsfalle klickt man 3 mal auf "Weiter", und muss gar nix lesen können, von daher passt das schon.
- Ein paar hübsche Bilder und Icons um den Gesamteindruck abzurunden.
Es gab ein paar Probleme und ich musste viele Dinge googeln, aber insgesamt war das in einem Nachmittag machbar. Am Ende hatte ich folgendes Skript:
Install Creator und Install Forge hatte ich beide angeschaut, aber da gingen immer irgendwelche Sachen nicht und am Ende hatte ich keinen Bock mehr.
Was ich jetzt mit NSIS hinbekommen haben:
- Ein Installer, der im wesentlichen eine selbstextrahierendes Archiv ist
- Desktopverknüpfung wird erzeugt
- Keine Admin-Rechte nötig. User/AddData/Roaming/ als Standardpfad (das Spiel schreibt Dateien in sein Installationsverzeichnis, ich brauche also was mit Schreibrechten)
- Startbildschirm mit kurzer Begrüßung
- Installer hat auch auf High DPI keine verwaschenen Texte (sehr geläufiges Problem!)
- Zweisprachig. Standarddialoge sind automatisch übersetzt, Begrüßungsbildschirm ist deutsch + englisch. Sprache wird vom System ermittelt, dort wo ich es bisher getestet habe lief das gut. Im Bezug auf unsere Sprachdiskussion anderswo, geht es hier ja auch nicht um die Lieblingssprache sondern um irgendeine Sprache die der aktuelle Nutzer versteht. Im Zweifelsfalle klickt man 3 mal auf "Weiter", und muss gar nix lesen können, von daher passt das schon.
- Ein paar hübsche Bilder und Icons um den Gesamteindruck abzurunden.
Es gab ein paar Probleme und ich musste viele Dinge googeln, aber insgesamt war das in einem Nachmittag machbar. Am Ende hatte ich folgendes Skript:
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Schrompf
- Moderator
- Beiträge: 5350
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Spiele veröffentlichen
Gut zu wissen, Danke! Und gleich mit Code-Beispiel <3
Den NSIS habe ich damals auch verwendet, glaube ich, aber es ist alles sooo lange her.
Den NSIS habe ich damals auch verwendet, glaube ich, aber es ist alles sooo lange her.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Spiele veröffentlichen
Der hat aber, tatsächlich, diesen März nochmal ein Update bekommen. Das Ding ist alt aber nicht tot.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
Re: Spiele veröffentlichen
Nicht alle mögen Installer, also wollte ich doch gerne auch noch parallel zip-Dateien anbieten.
Zwei Dateien bedeutet doppelte Pflege, das ist recht nervig, aber zum Glück gibt es Abhilfe.
Erst habe ich geschaut, ob der Nullsoft-Installer wohl auch automatisch zip-Dateien erzeugen kann. Dazu hab ich aber erstmal nichts gefunden. Allerdings liegt bei mir auch der Spezialfall vor, dass das komplette Spiel samt Assets und Konfigurationsdateien in ein einzelnes Verzeichnis (mit Schreibrechten, für Savegames etc.) extrahiert wird. Das Spiel hat zwar intern schon Logik, um Dateien aus verschiedenen Data- und User- Verzeichnissen zu laden, aber die zeigen beide auf das selbe Verzeichnis. Weil Dinge, die simpel sind, seltener kaputt gehen.
Die Lösung war es dann, 7zip zu benutzen. Das kann ja fast alles öffnen, unter anderem auch NSIS Installer exe-Dateien. Und netterweise liegen dort alle Installerresourcen in einem separaten Unterordner. Also per Kommandozeile den Installer in ein temporäres Verzeichnis entpacken, das Installerunterverzeichnis löschen, und alles wieder neu in eine zip-Datei packen. Führte zumindest bei meinem Installer im obigen Spezialfall zu identischen Ergebnissen. Dank 5 Zeilen .bat Datei baue ich dann jetzt mit einem Klick identische Installer und zips:
Ich hatte irgendwo anders schonmal geschrieben, dass es auch das Problem gibt, dass das bin-Verzeichnis auf meiner Festplatte nicht unbedingt identisch zu dem, was später in Installer landen soll ist. Teilweise, weil ich aus Bequemlichkeit ein paar Development-Dinge da liegen habe (ein schnelles Script, das irgendwas mit den Assets macht, z.B.), andererseits weil so Dinge wie Highscore und Config natürlich für die Installation frisch und neu sein sollen.
Das kann man aber im Installer-Scrip regeln: Statt der "config.json" wird dann halt die "config_fresh.json" geladen und im Installer in "config.json" umbenannt. So kann man dann idealerweise am Spiel rumbasteln und sobald man zufrieden ist einen Knopf drücken und hat die neue Version. Die ist davon zwar noch lange nicht auch auf meiner Webseite, aber das ist ein Thema für einen anderen Tag.
Zwei Dateien bedeutet doppelte Pflege, das ist recht nervig, aber zum Glück gibt es Abhilfe.
Erst habe ich geschaut, ob der Nullsoft-Installer wohl auch automatisch zip-Dateien erzeugen kann. Dazu hab ich aber erstmal nichts gefunden. Allerdings liegt bei mir auch der Spezialfall vor, dass das komplette Spiel samt Assets und Konfigurationsdateien in ein einzelnes Verzeichnis (mit Schreibrechten, für Savegames etc.) extrahiert wird. Das Spiel hat zwar intern schon Logik, um Dateien aus verschiedenen Data- und User- Verzeichnissen zu laden, aber die zeigen beide auf das selbe Verzeichnis. Weil Dinge, die simpel sind, seltener kaputt gehen.
Die Lösung war es dann, 7zip zu benutzen. Das kann ja fast alles öffnen, unter anderem auch NSIS Installer exe-Dateien. Und netterweise liegen dort alle Installerresourcen in einem separaten Unterordner. Also per Kommandozeile den Installer in ein temporäres Verzeichnis entpacken, das Installerunterverzeichnis löschen, und alles wieder neu in eine zip-Datei packen. Führte zumindest bei meinem Installer im obigen Spezialfall zu identischen Ergebnissen. Dank 5 Zeilen .bat Datei baue ich dann jetzt mit einem Klick identische Installer und zips:
Code: Alles auswählen
makensis installer.nsi
REM: Create the zip file from the installer
@RD /S /Q c:\tmp\installer
7z x "Water Breakout 1.2 Setup.exe" -oc:\tmp\installer
@RD /S /Q -oc:\tmp\installer "c:\tmp\installer\$PLUGINSDIR"
7z a "Water Breakout 1.2.zip" c:\tmp\installer\*
@RD /S /Q c:\tmp\installer
Ich hatte irgendwo anders schonmal geschrieben, dass es auch das Problem gibt, dass das bin-Verzeichnis auf meiner Festplatte nicht unbedingt identisch zu dem, was später in Installer landen soll ist. Teilweise, weil ich aus Bequemlichkeit ein paar Development-Dinge da liegen habe (ein schnelles Script, das irgendwas mit den Assets macht, z.B.), andererseits weil so Dinge wie Highscore und Config natürlich für die Installation frisch und neu sein sollen.
Das kann man aber im Installer-Scrip regeln: Statt der "config.json" wird dann halt die "config_fresh.json" geladen und im Installer in "config.json" umbenannt. So kann man dann idealerweise am Spiel rumbasteln und sobald man zufrieden ist einen Knopf drücken und hat die neue Version. Die ist davon zwar noch lange nicht auch auf meiner Webseite, aber das ist ein Thema für einen anderen Tag.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- TomasRiker
- Establishment
- Beiträge: 126
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Spiele veröffentlichen
Wenn ich ein Programm runterlade, das es nur als Installer gibt, versuche ich auch immer als erstes, den Installer mit 7-Zip zu öffnen und einfach alles zu entpacken. In den meisten Fällen klappt das wunderbar.
Re: Spiele veröffentlichen
Das mache ich auch immer... Wenn 7-Zip nicht hilft, dann meistens der Universal Extractor (v1.6.1, nicht die neuere) und bei aktuelleren Inno Setup-Installern der InnoExtractor - letztes Mittel ist dann IZArc 😅TomasRiker hat geschrieben: ↑28.06.2024, 21:04 Wenn ich ein Programm runterlade, das es nur als Installer gibt, versuche ich auch immer als erstes, den Installer mit 7-Zip zu öffnen und einfach alles zu entpacken. In den meisten Fällen klappt das wunderbar.
Re: Spiele veröffentlichen
Hab eine neue Version gebaut. Diesmal mit besserer Datei-Auswahl und automatisierter.
Weil die Nullsoft-Skript-Sprache sehr fummelig und unintuitive ist, hab ich es nie geschafft, damit die korrekten Dateien auszuwählen. Aber stattdessen gibt es jetzt ein Python-Skript, dass alle Dateien sammelt und daraus einen Installer und eine Zip-Datei bastelt. Das geht in mein "Bin" Verzeichnis (wo das Spiel während der Entwicklung liegt) und sammelt alle Dateien ein. Ich hab da aber auch ein wenig temporären Kram (Userprofil, alternative Configs, Test-Level, etc.) die nicht mit rein sollen, dafür gibt es im Python Script eine Liste mit Exclude-Patterns. Anschließend will ich natürlich eine saubere Config und leere Highscore haben, also gibt es einen Overwrite-Folder aus dem eine handvoll neue Dateien mit reinkopiert werden.
Am Ende gibt es dann eine Setup.exe und eine Zip-Datei mit identischen Inhalt. Und wo wir jetzt eh schonmal in Python sind, könnte man die direkt auf den Webserver laden oder so, aber so weit will ich es zum jetzigen Zeitpunkt dann doch nicht treiben.
installer.nsi
generate_installer.py
Weil die Nullsoft-Skript-Sprache sehr fummelig und unintuitive ist, hab ich es nie geschafft, damit die korrekten Dateien auszuwählen. Aber stattdessen gibt es jetzt ein Python-Skript, dass alle Dateien sammelt und daraus einen Installer und eine Zip-Datei bastelt. Das geht in mein "Bin" Verzeichnis (wo das Spiel während der Entwicklung liegt) und sammelt alle Dateien ein. Ich hab da aber auch ein wenig temporären Kram (Userprofil, alternative Configs, Test-Level, etc.) die nicht mit rein sollen, dafür gibt es im Python Script eine Liste mit Exclude-Patterns. Anschließend will ich natürlich eine saubere Config und leere Highscore haben, also gibt es einen Overwrite-Folder aus dem eine handvoll neue Dateien mit reinkopiert werden.
Am Ende gibt es dann eine Setup.exe und eine Zip-Datei mit identischen Inhalt. Und wo wir jetzt eh schonmal in Python sind, könnte man die direkt auf den Webserver laden oder so, aber so weit will ich es zum jetzigen Zeitpunkt dann doch nicht treiben.
installer.nsi
Code: Alles auswählen
; save as UTF8 with BOM to enable unicode support!
RequestExecutionLevel user ; avoid requiring administrator rights
ManifestDPIAware true ; important to avoid blurry text on high dpi systems!
!include MUI2.nsh ; 'modern' user interface
Name "Harald Hoppelhase"
OutFile "Hase_Setup.exe"
InstallDir $AppData\Hase
!define APP_VERSION "0.2.5"
VIProductVersion "${APP_VERSION}.0"
VIAddVersionKey /LANG=1033 "ProductName" "Harald Hoppelhase"
VIAddVersionKey /LANG=1033 "FileDescription" "Harald Hoppelhase Setup"
VIAddVersionKey /LANG=1031 "ProductName" "Harald Hoppelhase"
VIAddVersionKey /LANG=1031 "FileDescription" "Installationsprogramm für Harald Hoppelhase"
!define INPUT_DIR "../../../Bin/Hase"
!define MUI_ICON "${INPUT_DIR}\data\harald.ico"
; IMPORTANT: When saivng images: BMP mandatory, in gimp activate "Do not write color space information" and 24 bis (R8G8B8)
!define MUI_WELCOMEFINISHPAGE ; first, activate bitmap
!define MUI_WELCOMEFINISHPAGE_BITMAP "harald.bmp" ; then, specify it
!define MUI_WELCOMEFINISHPAGE_BITMAP_STRETCH AspectFitHeight
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "eggs_collection.bmp"
!define MUI_HEADERIMAGE_BITMAP_STRETCH AspectFitHeight
;!define MUI_BGCOLOR aaffbb
!define MUI_WELCOMEPAGE_TITLE "Harald Hoppelhase v. ${APP_VERSION}"
!define MUI_WELCOMEPAGE_TEXT "$(MyWelcomeText)"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
; important: Language stuff must come after page stuff (no idea why)
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "German"
LangString MyWelcomeText ${LANG_ENGLISH} "This installer extracts the game to the specified folder and creates a desktop shortcut. No other system changes are made. To uninstall, simply delete the game folder."
LangString MyWelcomeText ${LANG_GERMAN} "Dieses Installationsprogramm entpackt das Spiel in den gewählten Order und erstellt eine Desktop-Verknüpfung. Es werden keine weiteren Änderungen am System vorgenommen. Um das Spiel zu deinstallieren, lösche einfach den Spieleordner."
Function .onInit
;StrCpy $LANGUAGE ${LANG_GERMAN} ; for testing other languages
FunctionEnd
Section ""
SetOutPath $INSTDIR
; ##GENERATED_FILES##
CreateShortcut "$DESKTOP\Harald Hoppelhase.lnk" "$INSTDIR\Hase.exe"
SectionEnd
generate_installer.py
Code: Alles auswählen
import os
import subprocess
import sys
import zipfile
from pathlib import PurePosixPath
# --- Configuration ---
BASE = r"../../../Bin/Hase"
OVERLAY = r"overlay"
TEMPLATE_NSI = r"installer.nsi"
OUTPUT_NSI = r"installer_generated.nsi"
ZIP_OUTPUT = r"Hase.zip"
MAKENSIS = r"C:\Program Files (x86)\NSIS\makensis.exe"
PLACEHOLDER = "; ##GENERATED_FILES##"
EXCLUDE = [
r"highscore_backup.json",
"user_*.cfg",
#"imgui.ini",
r"data\TextureColors.bin",
r"data\model_binaries\*",
]
# --- Exclusion logic ---
def should_exclude(rel_path):
p = PurePosixPath(rel_path.replace("\\", "/"))
return any(p.match(pat.replace("\\", "/")) for pat in EXCLUDE)
# --- Collect included files from base ---
def collect_base_files():
result = []
for root, _, files in os.walk(BASE):
rel_dir = os.path.relpath(root, BASE)
for fname in files:
rel_file = os.path.join(rel_dir, fname).lstrip(".\\")
if not should_exclude(rel_file):
result.append((rel_file, os.path.join(root, fname)))
return result
# --- Collect all overlay files ---
def collect_overlay_files():
result = []
for root, _, files in os.walk(OVERLAY):
for fname in files:
abs_path = os.path.join(root, fname)
rel_file = os.path.relpath(abs_path, OVERLAY)
result.append((rel_file, abs_path))
return result
# --- Unified file list: overlay takes priority over base ---
def collect_all_files():
overlay_files = collect_overlay_files()
overlay_rel = {rel for rel, _ in overlay_files}
base_files = [(rel, abs) for rel, abs in collect_base_files()
if rel not in overlay_rel]
return base_files + overlay_files
# --- Generate NSIS file selection block ---
def generate_file_commands():
lines = []
current_dir = None
for rel_file, abs_path in collect_all_files():
rel_dir = os.path.dirname(rel_file)
if rel_dir != current_dir:
install_subdir = "$INSTDIR" if rel_dir == "" else f"$INSTDIR\\{rel_dir}"
lines.append(f' SetOutPath "{install_subdir}"')
current_dir = rel_dir
lines.append(f' File "{abs_path}"')
return "\n".join(lines)
# --- Generate zip ---
def generate_zip():
with zipfile.ZipFile(ZIP_OUTPUT, "w", zipfile.ZIP_DEFLATED) as zf:
for rel_file, abs_path in collect_all_files():
zf.write(abs_path, rel_file)
print(f"Generated {ZIP_OUTPUT}")
# --- Read template ---
with open(TEMPLATE_NSI, "r") as f:
template = f.read()
if PLACEHOLDER not in template:
print(f"ERROR: Placeholder '{PLACEHOLDER}' not found in {TEMPLATE_NSI}")
sys.exit(1)
# --- Inject and write NSI ---
# os.makedirs(os.path.dirname(OUTPUT_NSI), exist_ok=True)
generated = template.replace(PLACEHOLDER, generate_file_commands())
with open(OUTPUT_NSI, "w") as f:
f.write(generated)
print(f"Generated {OUTPUT_NSI}")
# --- Generate zip ---
generate_zip()
# --- Compile installer ---
result = subprocess.run([MAKENSIS, OUTPUT_NSI])
sys.exit(result.returncode)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/