Libgdx之数据保存 和 数据加密

Posted zqiang_55

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Libgdx之数据保存 和 数据加密相关的知识,希望对你有一定的参考价值。

Libgdx 中使用Preference以哈希表的形式进行数据的保存,在桌面版保存在目录”.prefs”下面,注意所有桌面的Preference都保存在.prefs目录下,所以文件名最好以”com.myname.game1.settings”而不是”Settings”
只有调用方法flush才会将数据从内存保存到磁盘上
Gdx.app.getPreferences(String filename)来创建Preference实例
public boolean contains (String key);
public void clear ();
public void remove (String key);
/* Makes sure the preferences are persisted. /
public void flush ();

这样保存数据是明文保存的,有时候我们需要加密数据,不想任何人都可以看到和修改,这时我们需要使用Base64Coder来进行加密。
现在我们先看Preferences进行数据保存的代码,之后再看加密的代码
Preferences保存数据

public class PreferenceTest extends ApplicationAdapter 
    Preferences pre;
    SpriteBatch sb;
    BitmapFont bf;

    @Override
    public void create() 
        pre = Gdx.app.getPreferences("PreferenceTest");

        pre.putBoolean("IsBool", true);
        pre.putInteger("IsInt", 2);
        pre.putString("IsString", "Libgdx");
        pre.flush();

        sb = new SpriteBatch();
        bf = new BitmapFont();
    

    @Override
    public void render() 
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, "IsBoole=" + pre.getBoolean("IsBool") + "  IsInt=" + pre.getInteger("IsInt") + "  IsString=" + pre.getString("IsString"), 40, 40);
        sb.end();
    


    @Override
    public void dispose() 
        sb.dispose();
        bf.dispose();
    

使用Base64Coder加密操作的代码,示例比较简单,首先需要一个辅助类-DataSaveSecurity-来加密解密数据,

public class DataSaveSecurity 
    private Save save;
    private FileHandle file = Gdx.files.local("bin/scores.json");

    public DataSaveSecurity() 
        save = getSave();
    

    private Save getSave() 
        Save save = new Save();

        if (file.exists()) 
            Json json = new Json();
            // 读取文件,并且解密
            save = json.fromJson(Save.class, Base64Coder.decodeString(file.readString()));
        
        return save;
    

    public void saveToJson() 
        Json json = new Json();
        json.setOutputType(OutputType.json);
        file.writeString(Base64Coder.encodeString(json.prettyPrint(save)), false);
    

    public void saveDataValue(String key, Object object)
        save.data.put(key, object);
        saveToJson(); // 立即保存数据

    

    public Integer loadDataValue(String key, Class<Integer> type)
        // 如果包含key的数据则返回数据,否则返回null
        if(save.data.containsKey(key))  
            return (Integer) save.data.get(key);
        else 
            return null;
    
    /** 根据需要T替换要读取的类型
     * public <T> T loadDataValue(String key, Class type)
        if(save.data.containsKey(key))return (T) save.data.get(key);
        else return null;   //this if() avoids exception, but check for null on load.

    
     */
    private static class Save 
        public ObjectMap<String, Object> data = new ObjectMap<String, Object>();
    

之后是对数据的操作

public class DataSecurityTest extends ApplicationAdapter 

    SpriteBatch sb;
    BitmapFont bf;
    DataSaveSecurity dataSaveSecurity;

    @Override
    public void create() 
        sb = new SpriteBatch();
        bf = new BitmapFont();

        dataSaveSecurity = new DataSaveSecurity();
        for (int i = 0; i < 3; i++) 
            dataSaveSecurity.saveDataValue("data"+i, 100+i);
        
    

    @Override
    public void render() 
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data0", Integer.class), 40, 40);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data1", Integer.class), 40, 80);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data2", Integer.class), 40, 120);
        sb.end();
    

    @Override
    public void dispose() 
        sb.dispose();
        bf.dispose();
    

以上是关于Libgdx之数据保存 和 数据加密的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx 之SpriteBatch深入分析

LibGDX:安卓游戏安全

Libgdx之TextFiled 文本输入框

Libgdx之TextFiled 文本输入框

LibGDX 多循环音效在桌面上工作,但在 Android 上不工作

Libgdx之XML文件解析