Andengine基础学习笔记之保存和加载游戏数据

在游戏框架中,我们常常会设置一些类,用来管理和设置数据。比较显而易见的需要保存的游戏数据有得分、最高分以及其它很多的数据。我们还应该知道游戏的确切设置,比如是否静音,有无音效。。。现在我们通过SharedPreferences帮助实现。它允许我们容易的在设备中保存和回复数据。

下面我们来实现UserDate类

例子中我们假设会存储一个Boolean变量,用来表示是否静音和一个int变量,用来表示我们最大的用户已经解锁的关卡数。

根据游戏的设定,我们可能会或多或少的需要不同类型的变量用来表示各种不同的选项,比如最高分等相关的数据。

接下来就让我们创建一个类包括保存用户数据。

1、第一步包括,声明我们静态的String变量,其保存对保存文件的引用和数据索引值。另外我们还要声明SharedPreference 对象和editor。

private static final String PREFS_NAME="GAME_USERDATA";

private static final String UNLOCKED_LEVEL_KEY="unlockedLevels";

private staic final String SOUND_KEY="soundKey";

private SharedPreferences mSettings;

private SharedPreferences.Editor mEditor;

private int mUnlockedlevels;

private int mSoundEnabled;

2、创建一个SharedPreferences文件的初始化方法,这个方法会在我们游戏刚开始运行时加载,如果文件不存在则会创建一个新的数据文件。如果文件存在,则会加载存储的数据。

public synchronized void init(Context pContext)

{

  if(mSettings==null){    //如果用户设置文件存在,则加载用户数据

  mSettings=context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);  //保存的文件其它是个xml文件,该语句获取该xml设置文件的引用 。

  mEditor=mSettings.edit();              //定义 editor,用来存储我们的数据至preference 文件

  mUnloadLevels=mSettins.getInt(UNLOCKED_LEVEL_KEY,1);  //恢复我们前的解锁的关卡数,如果目前值不存在,则默认将其值设置为1

  mSoundEnabled=mSettins.getBoolean(SOUND_KEY,true);//恢复我们的声音设置,如果值不存在,则默认将其值设置为true.

}

}

2、接下来,我们就要为每一个将要存储的值实现setter方法,目的是保存数据到设备中。

public synchronized void unlockNextLevel(){

mUnlockedLevels++;

mEditor.putInt(UNLOCKED_LEVEL_KEY,mUnlockedLevels);

mEditor.commit(); //commit一定要在在最后调用,使数据保存到文件中。

}

这个例子说明了我们可以很容易的保存和恢复我们的数据通过SharedPreferences类。UserData的结构很直接,我们可以使用这种模式至其它类型的数据中。

下面我们来理一理思路:

首先,我们开始声明所有需要的常数、成员变量,其用来保存各种不同的数据。对于常数,我们这里使用了PREFES_NAME来定义游戏preference file的名字。其它的两个String值每一个保存了数据的索引键值。对于每一个索引值,我们都对应的声明了要保存的变量值 。

第二步,我们提供了一系列的从preference file 中加载数据的方法,这个方法仅需在游戏开始的时候调用一次,加载保存在数据文件中的数据。而第一次调用context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);我们检测,数据文件是否存在,如果没有存在,则新创建一个MODE_PRIVATE的文件,表示该数据文件不可以被其它应用访问。

一旦以后的工作完成,我们就要根据每个数据变量设定getter方法,比如mUnlockedLevels=mSettins.getInt(UNLOCKED_LEVEL_KEY,1);这会获得存储在preference file中的数据。如果当前preference file没有保存任何数据,那就会传递默认的1给mUnlocakedLevels。这个方法继续执行,将获取所有同UserData管理的数据。在这时,仅是关卡和音乐,当然可以处理更多的值。

第三步中我们实现了很多的getter方法,可以获取对应的数据值。这个方法可以在整个游戏的任何位置调用,比如我们这里可以在关卡加载时调用UserData.getInstance().isSoundMuted();来判断我们是否要运行音乐。

第四步我们同样要实现一此方法来改变保存的数据。这些方法很直接,我们甚至不需要关注 数据的类型,我们或者可以设定数据通过setSoundMuted(pEnableSound)或者是简单的增加通过unlockNextLevel();

当我们最终保存数据在设备中时,我们使用mEditor对象的put方法来选择适合的数据类型保存我们的数据。比如,对于关卡的unlocking值,我们存储int值时使用mEditor.putInt(UNLOCKED_LEVEL_KEY,mUnlockedLevels);,对于boolean 变量我们使用putBoolean(pKey,pValue);对于String变量 ,我们使用putString(pKey,pValue);...

PS
这时还有一点我们要注意的是当我们保存数据在客户机上时,没有办法保证用户无法获得数据文件并且篡改它。在安卓平台上,大部分的用户是不能访问我们游戏保存的数据文件的,但是有些已经root的手机,可以访问和篡改我们的数据文件。我们在编程时为了理解简单,我们使用有意思的词表示数据,比如soundKey,unLockedLevels.但我们可以在保存时使用一些难以理解的词表示,这个方法可以帮助我们的数据文件看起来更像乱七八糟的文件。

如果我们想通过更好的办法保护数据文件,更加安全的方法就是重新编码我们的preference file.java的java.crypto.*包是一个好的开始。但要记住加密和解密会花费一些时间,其会增加游戏的加载时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值