Guten Abend!
Ich arbeite an einem kleinen Rollenspiel und möchte nun eine Speichern/Laden-Funktion einbauen. Dazu habe ich bei den gewünschten Klassen Serializable implementiert und mir eine Zusatzklasse geschrieben, welche das Speichern/Laden übernehmen soll. Zunächst möchte ich 3 Objekte abspeichern: Den Spieler (Charakter-Level, Stärke, Leben, ...), das Draw-Object (Position des Spielers) und das Maze-Object (2400x1800-Matrix, nach der das Spielfeld gezeichnet wird). Alle drei Objekte sind 'public static' und besitzen getter- und setter-Methoden.
Das Problem: Das Speichern/Laden des Spieler- und Draw-Objects funktioniert einwandfrei, heißt, solange ich mich im gleichen Level befinde, kann ich speichern und Laden. Wenn ich mich allerdings in ein neues Level begebe (die Matrix im Maze-Object wird dynamisch neu generiert) funktioniert es nicht mehr. Spieler und dessen Position werden zwar geladen, allerdings dann in dem neuen Maze platziert (evtl dann auch in einer Wand). Es wird daran liegen, dass das Maze-Objekt nicht richtig gespeichert wird, denn die Datei ist bloß 634 Bytes groß, was für eine 2400x1800-Matrix deutlich zu klein ist (In einem kleinen Testprogramm habe ich eine 2000x2000-Matrix abgespeichert, welche dann 15 Mb groß war). Ich hab schon versucht die Matrix aus der Maze-Klasse direkt abzuspeichern, ging aber auch nicht, da wurde beim Laden sogar ne Exception geworfen und die Datei war nur 4 Bytes groß. Ich poste hier mal die relevanten stellen im code:
Applet-Klasse:
saveLoad:
Wenn ich noch etwas an Code posten soll, bitte bescheid sagen. Bei Bedarf kann ich auch das komplette Spiel hochladen. Danke schonmal an diejenigen, die bis hierher gelesen haben
mfg, Christian
Ich arbeite an einem kleinen Rollenspiel und möchte nun eine Speichern/Laden-Funktion einbauen. Dazu habe ich bei den gewünschten Klassen Serializable implementiert und mir eine Zusatzklasse geschrieben, welche das Speichern/Laden übernehmen soll. Zunächst möchte ich 3 Objekte abspeichern: Den Spieler (Charakter-Level, Stärke, Leben, ...), das Draw-Object (Position des Spielers) und das Maze-Object (2400x1800-Matrix, nach der das Spielfeld gezeichnet wird). Alle drei Objekte sind 'public static' und besitzen getter- und setter-Methoden.
Das Problem: Das Speichern/Laden des Spieler- und Draw-Objects funktioniert einwandfrei, heißt, solange ich mich im gleichen Level befinde, kann ich speichern und Laden. Wenn ich mich allerdings in ein neues Level begebe (die Matrix im Maze-Object wird dynamisch neu generiert) funktioniert es nicht mehr. Spieler und dessen Position werden zwar geladen, allerdings dann in dem neuen Maze platziert (evtl dann auch in einer Wand). Es wird daran liegen, dass das Maze-Objekt nicht richtig gespeichert wird, denn die Datei ist bloß 634 Bytes groß, was für eine 2400x1800-Matrix deutlich zu klein ist (In einem kleinen Testprogramm habe ich eine 2000x2000-Matrix abgespeichert, welche dann 15 Mb groß war). Ich hab schon versucht die Matrix aus der Maze-Klasse direkt abzuspeichern, ging aber auch nicht, da wurde beim Laden sogar ne Exception geworfen und die Datei war nur 4 Bytes groß. Ich poste hier mal die relevanten stellen im code:
Applet-Klasse:
Java:
public static Draw drawMaze = new Draw();
public static Maze maze = new Maze();
public static Playa player;
[...]
//Methoden zum laden und speichern
public static Maze getMaze() {
return maze;
}
public static Playa getPlayer() {
return player;
}
public static Draw getDraw() {
return drawMaze;
}
public static void setPlayer(Playa p) {
player = p;
}
public static void setMazeO(Maze m) {
maze = m;
}
public static void setDraw(Draw d) {
drawMaze = d;
}
@Override
public void keyPressed(KeyEvent e) {
[...]
//F5
if (e.getKeyCode() == 116) {
saveLoad.serialize();
}
//F8
if (e.getKeyCode() == 119) {
saveLoad.deserialize();
// setMaze();
}
}
saveLoad:
Java:
public static void serialize() {
try {
FileOutputStream player = new FileOutputStream("player.dlx");
FileOutputStream maze = new FileOutputStream("maze.dlx");
FileOutputStream draw = new FileOutputStream("draw.dlx");
ObjectOutputStream oPlayer = new ObjectOutputStream(player);
ObjectOutputStream oMaze = new ObjectOutputStream(maze);
ObjectOutputStream oDraw = new ObjectOutputStream(draw);
oPlayer.writeObject(DeluxeRPG.getPlayer());
oMaze.writeObject(DeluxeRPG.getMaze());
oDraw.writeObject(DeluxeRPG.getDraw());
oPlayer.close();
oMaze.close();
oDraw.close();
} catch (IOException e) { System.err.println(e); }
}
public static void deserialize() {
Playa player;
Maze maze;
Draw draw;
try {
FileInputStream iPlayer = new FileInputStream("player.dlx");
FileInputStream iMaze = new FileInputStream("maze.dlx");
FileInputStream iDraw = new FileInputStream("draw.dlx");
ObjectInputStream oPlayer = new ObjectInputStream(iPlayer);
ObjectInputStream oMaze = new ObjectInputStream(iMaze);
ObjectInputStream oDraw = new ObjectInputStream(iDraw);
player = (Playa) oPlayer.readObject();
maze = (Maze) oMaze.readObject();
draw = (Draw) oDraw.readObject();
oPlayer.close();
oMaze.close();
oDraw.close();
DeluxeRPG.setPlayer(player);
DeluxeRPG.setMazeO(maze);
DeluxeRPG.setDraw(draw);
} catch (IOException e) {
System.err.println(e);
} catch (ClassNotFoundException e) {
System.err.println(e);
}
}
Wenn ich noch etwas an Code posten soll, bitte bescheid sagen. Bei Bedarf kann ich auch das komplette Spiel hochladen. Danke schonmal an diejenigen, die bis hierher gelesen haben
mfg, Christian