# Spiel installeren lassen und organisieren



## SilverClaw (29. Jan 2014)

Guten Morgen,

erstmal entschuldige ich mich im voraus, falls das hier das komplett falsch Unterforum ist, aber ich bin mir nicht sicher, ob meine Sorgen noch zu Anfänger-Sachen oder sonstwo hin gehören, aber da ich das gerade an einem Spiel benutzen will, kommt es mal hier rein.

Mein Zwischenziel besteht gerade darin, ein kleines Spiel zu entwickeln, das vorerst nur mit Text auf einer 2D-Anzeige läuft, also mit Swing.
Man soll Waren auf einem Markt anbieten und erstehen können und kann Gebäude bauen, die erstmal Geld und Baumaterial kosten, dann aber wieder Waren produzieren.

Mein erster Stolperstein wäre allerdings schon die Installation auf verschiedenen Betriebssystemen, die ich bisher mehr schlecht als recht zusammen gebastelt habe:

aus der Main kommen:



> public final static String home = System.getProperty("user.home");
> public final static String sep = System.getProperty("file.separator");
> public final static String checkFileLocation = home+sep+"check.txt";




```
package manager;

import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;

public class Installer {

	private static String installPath = null;
	private static String [] checkText;
	private static String ressourcePath = null;
	static String sep = Main.sep;
	
	public static void installNew(String checkFileLocation) throws IOException {
		
		checkText = new String[10];
		
		JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		if(fc.showSaveDialog(JMainFrame.getWindow()) == JFileChooser.APPROVE_OPTION) {
			installPath = fc.getSelectedFile().getAbsolutePath();
			System.out.println(installPath);
			ressourcePath = installPath+sep+"ressource";
			
			//directories
			File ressource = new File(ressourcePath);
			ressource.mkdir();
			File goods = new File(ressourcePath+sep+"goods");
			goods.mkdir();
			File buildings = new File(ressourcePath+sep+"buildings");
			buildings.mkdir();
			
			//files
			File goodslist = new File(goods.getAbsolutePath()+sep+"goodslist.txt");
			goodslist.createNewFile();
			File readme = new File(installPath+sep+"Readme.txt");
			readme.createNewFile();
			
			FileHandler checker = new FileHandler(checkFileLocation);
				
				checkText[0] = "Damascus Pre-Alpha 0.3";
				checkText[1] = "installFolder :\n" + installPath;
				checkText[2] = "ressourceFolder:\n"+ ressourcePath;	
				
			checker.WriteLines(checkText);
		} else {
			installPath = "Kein Installationsverzeichnis ausgewählt.";
		}
	}
	
	public String getCheckFile() {
		File checkFile = new File(Main.checkFileLocation);
		if(checkFile.exists()) {
			return checkFile.getAbsolutePath();
		} else {
			return null;
		}
	}
}
```
Es läuft also darauf hinaus, dass der Speicherort in einer fest platzierten Check-Datei abgelegt wird und dadurch findet man später wieder die ganzen Dateien. Funktioniert wunderbar, bis jemand die Chech-Datei verschiebt, löscht oder ändert.
Habe zwar schon rumgesucht wie blöd, aber wrklich eine Lösung gefunden hab ich nicht.
Wie machen es denn versiertere Programmierer, wenn sie etwas auf Windows und Linux zum laufen kriegen wollen? :autsch:

Mein nächstes Problem wäre, dass ich nicht sicher bin, wie ich am besten mit den Daten umgehe, die aus Dateien geladen werden sollen.
Beispielsweise habe ich für Güter eine einfache Textdatei benutzt und darin steht dann:



> WATER
> "Eimer Wasser"
> "Eimer Wasser"
> 0.2
> ...



Ich gehe bisher ja davon aus, dass es am sinnvollsten ist, die Waren dann zum Spielstart aus der Datei auslesen zu lassen und die ganze Zeit als HashMap gespeichert zu halten. Wenn dann ein Spieler etwas kauft, bekommt er eine Kopie der geladenen Waren. Dann stellt sich mir die Frage, ob es sinnvoll ist, dazu gleich die Mengen zu speichern, in welchen diese jeweils vorkommt oder ob das auch eleganter gehen würde.
Für Gebäude stelle ich mir das ganze etwas schwieriger vor, weil man für die auch irgendwie abspeichern können sollte, was diese produzieren, wobei z.B. Farmen gerne mehrere Optionen bieten sollten.

Also wäre meine Frage ganz allgemein:
Wie organisiert ihr es, wenn ihr auf Daten zugreifen wollt? Textdateien oder gibt es sinnvolleres?
Lädt man besser gleich alles raus, was man früher oder später ohnehin braucht oder ist es doch sinnvoller die Datenschnipsel jedes mal wieder aus der Datei zu holen?
Und hat irgendwer Erfahrung, mit welchen Datenstrukturen man am besten so etwas wie Warenlager abbildet? Ich schwanke da immernoch zwischen ArrayList und HashMap.

Falls irgendwer guten Rat weiß, wäre ich dankbar,
SilverClaw


----------



## Gucky (29. Jan 2014)

Eine Möglichkeit für das Speichern des Spielstandes wäre die Serialisierung, bei der wirklich alles, nicht extra gekennzeichnetes, gespeichert wird. Deine Klassen müssten nur das leere Interface Serializable implementieren.

Für das Speichern von Informationen, wo keiner ran soll, gibt es unter Windows die Regestry. (ja man kommt doch ran aber nur schser und für gewöhnlich tut das keiner) Ich weiß nicht, wie das unter Mac oder Unix heißt aber etwas vergleichbares müsste es da auch geben.


----------



## SilverClaw (29. Jan 2014)

Hmmm, Minecraft z.B. speichert ja vor allem in /appdata.
Unter Linux wäre es wohl sowas wie /etc

Aber was wäre denn ein gängiger Weg, so etwas zu verteilen?
Sollte man alle "festen" Daten in einen sicheren (also versteckten, den normale Anwender eher nicht anfassen) Ordner speichern und für den Endnutzer eine Verknüpfung zur Verfügung stellen?
Ich hatte ja erwartet, dass es einfacher wäre, dazu etwas zu finden, allerdings steht in den meisten Foren, die ich bisher gesehen habe miest nur, dass es recht komplziert sein dürfte, weiter wird dann nicht darauf eingegangen.
Da ich Java vor allem wegen der angeblichen Plattformunabhängigheit mag, enttäuscht das doch ein wenig.

Serializable sieht interessant aus, allerdings frage ich mich ja eher, WO und WIE man die Daten ablegen sollte, sodass man relativ einfach neue Waren oder Häuser hinzufügen kann, ohne direkt im Java-Code herum pfuschen zu müssen. Dazu habe ich bisher auch recht wenig hilfreiches gefunden, was daran liegen könnte, dass das auf ganz andere Weise gelöst wird, als ich es mir denke.
Viele OpenSource-Spiele scheinen ja mit XML-Dateien zu arbeiten, wo man dann z.B. für Einheiten über den Internet-Browser beliebig andere Werte rein schreiben kann. Würde was hier schon Sinn machen?
Und falls es zu sowas irgendwo Tutorials gibt, in denen das ausführlich genug erklärt wird, wäre ich auch dafür dankbar. Vielleicht habe ich ja bisher nur das falsche gesucht. :rtfm:


----------



## Gucky (29. Jan 2014)

Du pfushst nicht im Code rum. Nahezu alle Klassen aus der API implementieren Serializable und du musst nur dieses Interface implementieren.mehr nucht. Dann schreibst du mit einen ObjectOutputStream die Objekte in eine Datei. An diese speziallen, vom OS gebotenen Pfade ranzukommen, gibt es spezielle Methoden, die ich aber nicht kenne. Die müsstest du dir ergooglen.


----------

