- move SaveGame util to core plugins - fix BinaryImporter accessing assetManager if null git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8872 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
e441f95d5e
commit
5ce347eec8
@ -0,0 +1,118 @@ |
|||||||
|
/* |
||||||
|
* 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 com.jme3.system.JmeSystem; |
||||||
|
import java.io.BufferedInputStream; |
||||||
|
import java.io.BufferedOutputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
import java.util.zip.GZIPInputStream; |
||||||
|
import java.util.zip.GZIPOutputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* 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. |
||||||
|
* @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) { |
||||||
|
BinaryExporter ex = BinaryExporter.getInstance(); |
||||||
|
OutputStream os = null; |
||||||
|
try { |
||||||
|
File daveFolder = new File(JmeSystem.getStorageFolder().getAbsolutePath() + File.separator + gamePath.replaceAll("/", File.separator)); |
||||||
|
if (!daveFolder.exists() && !daveFolder.mkdirs()) { |
||||||
|
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error creating save file!"); |
||||||
|
throw new IllegalStateException("SaveGame dataset cannot be created"); |
||||||
|
} |
||||||
|
File saveFile = new File(daveFolder.getAbsolutePath() + File.separator + dataName); |
||||||
|
if (!saveFile.exists()) { |
||||||
|
if (!saveFile.createNewFile()) { |
||||||
|
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error creating save file!"); |
||||||
|
throw new IllegalStateException("SaveGame dataset cannot be created"); |
||||||
|
} |
||||||
|
} |
||||||
|
os = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(saveFile))); |
||||||
|
ex.save(data, os); |
||||||
|
} catch (IOException ex1) { |
||||||
|
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error saving data: {0}", ex1); |
||||||
|
ex1.printStackTrace(); |
||||||
|
throw new IllegalStateException("SaveGame dataset cannot be saved"); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (os != null) { |
||||||
|
os.close(); |
||||||
|
} |
||||||
|
} catch (IOException ex1) { |
||||||
|
Logger.getLogger(SaveGame.class.getName()).log(Level.SEVERE, "Error saving data: {0}", ex1); |
||||||
|
ex1.printStackTrace(); |
||||||
|
throw new IllegalStateException("SaveGame dataset cannot be saved"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 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 or null if none was found |
||||||
|
*/ |
||||||
|
public static Savable loadGame(String gamePath, String dataName, AssetManager manager) { |
||||||
|
InputStream is = null; |
||||||
|
Savable sav = null; |
||||||
|
try { |
||||||
|
File file = new File(JmeSystem.getStorageFolder().getAbsolutePath() + File.separator + gamePath.replaceAll("/", File.separator) + File.separator + dataName); |
||||||
|
if(!file.exists()){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
is = new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))); |
||||||
|
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