- 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-0572b91ccdca3.0
parent
3071bd7b57
commit
e441f95d5e
@ -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…
Reference in new issue