6.保存游戏的一些探索
作者:互联网
要制作一个slg游戏,因为通常slg游戏内容过长,就必须对内容进行持久化保存
之前在1.自定义游戏地图格式的设定,加载,保存中是直接用java的FileOutputStream,DataOutputStream两个类的方法
public static void saveMapBin(MapBinDAO binFile, String Path) { try { FileOutputStream fs_out = new FileOutputStream(Path);//"D://test.bin" DataOutputStream out = new DataOutputStream(fs_out); out.writeShort(binFile.mapVersion);// 4 out.writeInt(binFile.mapWidth);// 8 out.writeInt(binFile.mapHeight);// 8 for (int i = 0; i < binFile.getMapbin().size(); i++) { out.writeByte(binFile.getMapbin().get(i).getBlockType());// 2 out.writeByte(binFile.getMapbin().get(i).getBackTile());// 2 out.writeByte(binFile.getMapbin().get(i).getBackIdx());// 2 out.writeByte(binFile.getMapbin().get(i).getBackRefX());// 2 out.writeByte(binFile.getMapbin().get(i).getBackRefY());// 2 out.writeByte(binFile.getMapbin().get(i).getForeTile());// 2 out.writeByte(binFile.getMapbin().get(i).getForeIdx());// 2 out.writeByte(binFile.getMapbin().get(i).getForeRefX());// 2 out.writeByte(binFile.getMapbin().get(i).getForeRefY());// 2 out.writeByte(binFile.getMapbin().get(i).getWaterPass());// 2 out.writeByte(binFile.getMapbin().get(i).getLandPass());// 2 out.writeInt(binFile.getMapbin().get(i).getRegionId());// 8 out.writeByte(binFile.getMapbin().get(i).getClimateId());// 2 } out.close(); // out.writeInt(i);//4位 // out.writeShort(i2);//2位 // out.writeByte(i3);//1位 // out.close(); } catch (FileNotFoundException fe) { System.err.println(fe); } catch (IOException ioe) { System.err.println(ioe); } System.out.println("Ok"); }View Code
现在要改成用libgdx的方法保存
这里我是在制作地图编辑器的过程中遇到这个需求,保存修改后的地图
这里我写了一个FileByte类,来模拟DataOutputStream类来保存byte数据
package com.zhfy.game.framework.tool; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; public class FileByte { private int bytesLength; private List<Integer> bytes; public void init() { bytes=new ArrayList<Integer>(); bytesLength=0; } //4 public final void writeInt(int v) throws IOException { if(bytes==null) { init(); } bytes.add((v >>> 24) & 0xFF); bytes.add((v >>> 16) & 0xFF); bytes.add((v >>> 8) & 0xFF); bytes.add((v >>> 0) & 0xFF); incCount(4); } //2 public final void writeShort(int v) throws IOException { if(bytes==null) { init(); } bytes.add((v >>> 8) & 0xFF); bytes.add((v >>> 0) & 0xFF); incCount(2); } //1 public final void writeByte(int v) throws IOException { if(bytes==null) { init(); } bytes.add(v); incCount(1); } private void incCount(int value) { int temp = bytesLength + value; if (temp < 0) { temp = Integer.MAX_VALUE; } bytesLength = temp; } //TODO 待验证 public byte[] getByte(){ byte[] bLocalArr = new byte[bytesLength]; int i,iMax;iMax=bytes.size(); for ( i = 0; i<iMax; i++) { bLocalArr[i] = (byte) (bytes.get(i)& 0xFF); } init(); return bLocalArr; } }View Code
然后保存方法修改为
public static void saveMapBin(MapBinDAO binFile, String Path) { try { FileByte out=new FileByte(); out.writeShort(binFile.mapVersion);// 4 out.writeInt(binFile.mapWidth);// 8 out.writeInt(binFile.mapHeight);// 8 for (int i = 0; i < binFile.getMapbin().size(); i++) { out.writeByte(binFile.getMapbin().get(i).getBlockType());// 2 out.writeByte(binFile.getMapbin().get(i).getBackTile());// 2 out.writeByte(binFile.getMapbin().get(i).getBackIdx());// 2 out.writeByte(binFile.getMapbin().get(i).getBackRefX());// 2 out.writeByte(binFile.getMapbin().get(i).getBackRefY());// 2 out.writeByte(binFile.getMapbin().get(i).getForeTile());// 2 out.writeByte(binFile.getMapbin().get(i).getForeIdx());// 2 out.writeByte(binFile.getMapbin().get(i).getForeRefX());// 2 out.writeByte(binFile.getMapbin().get(i).getForeRefY());// 2 out.writeByte(binFile.getMapbin().get(i).getWaterPass());// 2 out.writeByte(binFile.getMapbin().get(i).getLandPass());// 2 out.writeInt(binFile.getMapbin().get(i).getRegionId());// 8 out.writeByte(binFile.getMapbin().get(i).getClimateId());// 2 } FileHandle file = Gdx.files.local(Path); file.writeBytes(out.getByte(), false); // out.writeInt(i);//4位 // out.writeShort(i2);//2位 // out.writeByte(i3);//1位 // out.close(); } catch (FileNotFoundException fe) { System.err.println(fe); } catch (IOException ioe) { System.err.println(ioe); } System.out.println("Ok"); }View Code
在游戏中提示游戏保存成功
但是通过Everything这个搜索工具发现地址并没在预想的位置,如图的顶部和底部,底部是原文件位置,顶部是保存后生成的所在位置
主要原因是
// 根据mapid生成MapBinDAO类 public MapBinDAO getMapDaoByMapId(int mapId) { XmlReader reader = new XmlReader(); String str = ""; Element root = reader.parse(Gdx.files.internal("config/def_map.xml")); int childNum = root.getChildCount(); for (int i = 0; i < childNum; i++) { if (root.getChild(i).getInt("id") == mapId) { str = root.getChild(i).get("name"); bt = Gdx.files.internal("bin/" + str + ".bin").readBytes(); try { mapBinDao = GameMap.readMapBin(bt); } catch (IOException e) { e.printStackTrace(); } return mapBinDao; } } return mapBinDao; }View Code
保存位置用的方法是local,而我们加载资源时用的方法是internal方法
通过查资料得知
internal位置为只读位置
而local位置为可读可写的位置
并且专门实验了下,使用internal方法保存会出错,
所以这里把加载位置改为local,并放入desktop对应位置,在正式发布的时候再把文件放入android对应assets位置
标签:binFile,游戏,探索,get,bytes,保存,writeByte,getMapbin,out 来源: https://www.cnblogs.com/tysk/p/10721486.html