6.保存游戏的一些探索
2019-04-18 08:55:12来源:博客园 阅读 ()
要制作一个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"); }
现在要改成用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; } }
然后保存方法修改为
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"); }
在游戏中提示游戏保存成功
但是通过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; }
保存位置用的方法是local,而我们加载资源时用的方法是internal方法
通过查资料得知
internal位置为只读位置
而local位置为可读可写的位置
并且专门实验了下,使用internal方法保存会出错,
所以这里把加载位置改为local,并放入desktop对应位置,在正式发布的时候再把文件放入android对应assets位置
原文链接:https://www.cnblogs.com/tysk/p/10721486.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:权限之菜单权限
- 总结一些 Java 相关笔试、面试题,万一用上了呢 (=_=) -- 基 2020-06-08
- Java - IO - 字符流 2020-05-31
- 针对kafka_2.13版本测试过程中的一些坑 2020-05-23
- 【JAVA SE基础篇】6.开始前的一些规定以及关键字 2020-05-08
- 分享一些获得大厂offer:小技巧+面试流程+面试建议+面试资料 2020-05-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash