- use JmeSystem.getStorageFolder() for SaveGame util

- move SaveGame util to core plugins
- fix BinaryImporter accessing assetManager if null

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8871 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
nor..67 13 years ago
parent 3071bd7b57
commit e441f95d5e
  1. 101
      engine/src/desktop/jme3tools/savegame/SaveGame.java

@ -1,101 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jme3tools.savegame;
import com.jme3.asset.AssetManager;
import com.jme3.export.Savable;
import com.jme3.export.binary.BinaryExporter;
import com.jme3.export.binary.BinaryImporter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import sun.misc.UUDecoder;
import sun.misc.UUEncoder;
/**
* Tool for saving Savables as SaveGame entries in a system-dependent way.
* @author normenhansen
*/
public class SaveGame {
/**
* Saves a savable in a system-dependent way. Note that only small amounts of data can be saved.
* @param gamePath A unique path for this game, e.g. com/mycompany/mygame
* @param dataName A unique name for this savegame, e.g. "save_001"
* @param data The Savable to save
*/
public static void saveGame(String gamePath, String dataName, Savable data) {
Preferences prefs = Preferences.userRoot().node(gamePath);
BinaryExporter ex = BinaryExporter.getInstance();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
GZIPOutputStream zos = new GZIPOutputStream(out);
ex.save(data, zos);
zos.close();
} catch (IOException ex1) {
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error saving data: {0}", ex1);
ex1.printStackTrace();
}
UUEncoder enc = new UUEncoder();
String dataString = enc.encodeBuffer(out.toByteArray());
// System.out.println(dataString);
if (dataString.length() > Preferences.MAX_VALUE_LENGTH) {
throw new IllegalStateException("SaveGame dataset too large");
}
prefs.put(dataName, dataString);
}
/**
* Loads a savable that has been saved on this system with saveGame() before.
* @param gamePath A unique path for this game, e.g. com/mycompany/mygame
* @param dataName A unique name for this savegame, e.g. "save_001"
* @return The savable that was saved
*/
public static Savable loadGame(String gamePath, String dataName) {
return loadGame(gamePath, dataName, null);
}
/**
* Loads a savable that has been saved on this system with saveGame() before.
* @param gamePath A unique path for this game, e.g. com/mycompany/mygame
* @param dataName A unique name for this savegame, e.g. "save_001"
* @param assetManager Link to an AssetManager if required for loading the data (e.g. models with textures)
* @return The savable that was saved
*/
public static Savable loadGame(String gamePath, String dataName, AssetManager manager) {
Preferences prefs = Preferences.userRoot().node(gamePath);
String data = prefs.get(dataName, "");
InputStream is = null;
Savable sav = null;
UUDecoder dec = new UUDecoder();
try {
is = new GZIPInputStream(new ByteArrayInputStream(dec.decodeBuffer(data)));
BinaryImporter imp = BinaryImporter.getInstance();
if (manager != null) {
imp.setAssetManager(manager);
}
sav = imp.load(is);
} catch (IOException ex) {
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error loading data: {0}", ex);
ex.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ex) {
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error loading data: {0}", ex);
ex.printStackTrace();
}
}
}
return sav;
}
}
Loading…
Cancel
Save