其他分享
首页 > 其他分享> > 6.保存游戏的一些探索

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