Gibt es ein plattformübergreifendes Spezialverzeichnis, das ich zum Speichern von Spieledateien verwenden kann?

7

Ich entwickle mit LWJGL und Java auf einem Windows 7-Laptop. Ich habe das Speichern im Ordner %appdata%\gamename\saves\oder im Langform- c:\users\user\appdata\roaming\gamename\saves\Ordner mithilfe von erfolgreich eingerichtet File dir = new File(System.getenv("APPDATA") + "\\gamename\\saves\\");.

Ich habe Erfahrung auf Hobby-Niveau mit Linux und keine Erfahrung mit OSX. Mein Spiel wird vollständig plattformübergreifend sein.

Ist System.getenv("APPDATA");plattformübergreifend? Wenn ja, wohin verweist es unter Linux oder OSX? Gibt es eine Best-Practice- Alternative, die ich verwenden sollte?

Schaum
quelle

Antworten:

7

Ich verwende diesen Code gerade in meinem Spiel:

System.getProperty("user.home");

Einfach und effizient.

Es ist ein benutzerabhängiges Verzeichnis, das sich perfekt zum Speichern von Sicherungsdateien eignet. Ich verwende es jedoch zum Herunterladen und Speichern von Assets.

Klems
quelle
11

Es gibt kein solches Verzeichnis. %APPDATA%ist Windows-spezifisch. Sie müssen es selbst abstrahieren: Erstellen Sie Ihre eigene GetSaveGameDirectoryFunktion, die auf jedem Betriebssystem, auf dem Sie ausgeführt werden, einen geeigneten Pfad zurückgibt. Sie können diese Bestimmung normalerweise zur Kompilierungszeit mit Präprozessorprüfungen anhand der entsprechenden Makros in C (und es ist ilk) vornehmen. Ich bin mir nicht ganz sicher, wie ich das am besten in Java machen kann.

Unter Windows ist ein %APPDATA%Unterverzeichnis für Ihr Unternehmen oder Spiel geeignet. Auf dem Mac ~/Library/Application Support/Your Gameist dies üblich, obwohl in den Richtlinien von Apple empfohlen wird, "Benutzerdaten" dort nicht zu speichern (sie sollten in das ~/DocumentsVerzeichnis verschoben werden). Dies hängt in erster Linie davon ab, ob Sie den Benutzer zur Auswahl eines Verzeichnisses auffordern oder nicht.

Auf allgemeinen * nix-Systemen finden Sie wahrscheinlich weniger Standardisierung - vielleicht ein verstecktes Verzeichnis darin ~, wie z ~/.yourgame. Dies ist sicherlich die übliche Praxis für Konfigurationsdateien. Ein tatsächlicher * nix-Benutzer muss sich wahrscheinlich einschalten, ob dies ein geeigneter Speicherort für das Spiel ist oder nicht.

Um die besten Ergebnisse zu erzielen, codieren Sie den Pfad zum Verzeichnis nicht anhand der englischen Zeichenfolge fest, sondern verwenden Sie die Betriebssystem-API, um auf das Verzeichnis zuzugreifen. Auf diese Weise können Sie sicherstellen, dass Ihr Spiel auf einer nicht englischen Version des Betriebssystems ordnungsgemäß ausgeführt wird. Verwenden Sie beispielsweise unter Windows nach Möglichkeit SHGetKnownFolderPath oder einen entsprechenden Wrapper.


quelle
1
Erwähnenswert ist, dass Apple in der neuesten Version von OS X das Verzeichnis ~ / Library unsichtbar gemacht hat, sodass die meisten Benutzer dort keine Dateien mehr finden können. Daher ist es jetzt doppelt wichtig, Sicherungsdateien außerhalb dieser Hierarchie zu platzieren!
Trevor Powell
2
Ja, ~/.gamenameist das erwartete Verhalten (und wie es immer gemacht wird, siehe Minecraft, Warzone2100 und jedes andere Spiel). Wenn Sie weiterhin an einem anderen Ort speichern möchten, können Sie über dieses Verzeichnis einen Link erstellen. On general *nix systems you'll probably find less standardization... eigentlich fühle ich genau das Gegenteil (wenn wir über Linux, BSD und Unix sprechen ... nicht sicher über MacOS). Abgesehen von einigen schrecklichen Closed-Source-Spielen, die die Verzeichnisstruktur nicht berücksichtigen, finde ich meine Konfigurationsdateien und Spielspeicher immer in ~/.name.
Bobby
@Bobby Für Mac funktionieren Dotfiles / Dotfolders einwandfrei (wir haben immer noch .bash_profile, .emacs.d, .vimrc usw.), aber wenn Sie speziell auf Mac abzielen, geben Sie Ihre Daten bitte so ein, ~/Library/Application Support/Your Gamewie Josh es vorgeschlagen hat. Dadurch bleibt das gesamte Konzept "Sichern Sie Ihren Home-Ordner, um alles zu sichern, was Sie benötigen" von * nix erhalten, aber es gibt keine ~/Unmengen von Punktdateien. Während ~Libraryes sich jetzt um einen versteckten Ordner handelt, können Benutzer das Terminal öffnen, wenn sie wirklich speichern möchten. Oder Sie können eine Schaltfläche "Export speichern Datei" haben, die schöner erscheint. Ich bin mir nicht sicher, wie ich mich dabei fühle Documents.
michael.bartnett
2

Unter Linux wäre der einzige standardisierte Pfad das Verzeichnis XDG_DATA_HOMEund XDG_CONFIG_HOME. Verwenden Sie die Umgebungsvariablen mit diesen Namen, falls vorhanden, andernfalls standardmäßig $HOME/.local/share/<appname>/für Benutzerdaten (Speichern, Fortschritt, Spielerprofil) und $HOME/.config/<appname>/für die Konfiguration. Das Löschen des letzteren Verzeichnisses sollte theoretisch keine Auswirkungen auf vom Benutzer bereitgestellte Daten haben, außer alles auf die Standardeinstellungen zurückzusetzen. Sie haben auch XDG_CACHE_DIR( $HOME/.cache/<appname>) für nicht wesentliche / temporäre Dateien.

Wenn Sie alles in $HOME/.<appname>den Home-Ordner des Benutzers werfen, wird dies möglicherweise nicht gewürdigt. Bei der neuen Free Desktop-Standardisierungsinitiative handelt es sich um eine meist veraltete Praxis.

Aeyoun
quelle
1

Windows :

  • % UserProfile% \ Documents \ Saved Games \ GAMENAME \

Linux :

  • ~ / Gespeicherte Spiele / GAMENAME /

OSX :

  • ~ / Dokumente / Gespeicherte Spiele / GAMENAME /

Wie Josh erwähnt hat, keine Hardcode-Pfade - benutze die OS-API, um den richtigen Pfad zu verwenden :-)

BrandFeelsGood
quelle
1
Ich bin keine Hardcodierung von Pfaden. Ich hänge "\ gamename \ saved \" an% appdata% in Windows an. Ich habe tatsächlich ein Problem beim Speichern von Speicherungen in Dokumentenordnern - obwohl dies häufig vorkommt. Speichervorgänge sind keine Dokumente. Sie können / sollten sie nicht im Textverarbeitungsprogramm bearbeiten. Sie können sie nicht neu organisieren, ohne ihre jeweiligen Spiele / Apps zu beschädigen. Nichts sollte jemals etwas in einem Dokumentenordner ablegen. Es nervt mich höllisch. Sie überladen einen ansonsten gut organisierten Ort, um wichtige Dateien und Dokumente zu speichern, die mein Geschäft betreffen. Ende schimpfen. :-p
Suds
1
Es tut uns leid, dass wir überlaufen müssen - aber unter Windows ist genau das der Zweck des Ordners% appdata%. Speichern von Anwendungsdaten. Ich habe nicht genug Erfahrung mit anderen Betriebssystemen, um die richtigen Standorte mit ihnen zu kennen, aber es gibt sicherlich ein Äquivalent?
Suds
2
Ich bin mir nicht sicher, ob mir die Idee gefällt, myHome-Folder mit einem weiteren sichtbaren Ordner zusammenzufassen. Ich würde mich lieber dafür entscheiden ~/.gamename, denn das ist das Verhalten, das ich erwarten würde.
Bobby
Unter Windows muss es in einen Ordner verschoben werden, der die Ordnerumleitung und Roaming-Profile überlebt.
Maximus Minimus
-4

Ich denke, der beste Ort zum Platzieren von Spieldaten ist der Installationsordner Ihres Spiels, IE:

    %Install%/Saves/

Wobei% install% so etwas wie C: \ programfiles \ yourgame \ oder ~ / apps / yourgame / wäre

Matt Jensen
quelle
3
-1, auf den meisten Plattformen wird das Spiel an einem Ort installiert, an den der Benutzer nicht schreiben darf.
Bobby
Das Spiel hat die Berechtigung, darauf zu schreiben.
Matt Jensen
3
Nein es wird nicht. Und selbst wenn Sie dieses Betriebssystem nicht mehr verwenden sollten, weil die Berechtigungen fürchterlich fehlerhaft sind.
Bobby
4
Zusätzliches -1, da es in Mehrbenutzerumgebungen nicht robust ist. Was ist, wenn zwei verschiedene Personen denselben Computer verwenden und das Spiel spielen möchten? Wirklich, dies ist ein Problem, das im letzten Jahrhundert gelöst wurde - es geht in das Benutzerprofil, Ende der Auseinandersetzung. Einwände dagegen oder alternative Lösungen zu erheben, ist Zeit- und Energieverschwendung.
Maximus Minimus
3
Es geht nicht um Flammen, es geht um Best Practice. Dies funktioniert nicht auf fast allen Plattformen (funktioniert unter Windows XP, nicht sicher über Windows Vista oder Windows 7, funktioniert sicherlich nicht unter Unix, solange das Spiel nicht in Home-Directoy installiert ist, was es nicht sollte.) t sein). It works for meDas ist großartig, aber für den Rest der Welt funktioniert es nicht.
Bobby