本章的代码例子: http://vdisk.weibo.com/s/IxHyL
使用上篇文章的代码
现在实现动态数据的模型FishingJoyData继承自CCObject
FishingJoyData.h代码如下:
#include "cocos2d.h" using namespace cocos2d; class FishingJoyData:public CCObject { public: //创建单例的方法 static FishingJoyData* sharedFishingJoyData(); //金币的数量 CC_SYNTHESIZE(int, _gold, Glod); //开始 CC_SYNTHESIZE(bool, _isBeginner, IsBeginner); //音量值 CC_SYNTHESIZE(float, _soundVolume, SoundVolume); CC_SYNTHESIZE(float, _musicVolume, MusicVolume); //内存不足时调用 void purge(); //将数据从内存保存到外部文件,即写入到本地 void flush(); //对Glod进行操作,delta的值正负都可以 void alterGold(int delta); //重置游戏数据为默认值 void reset(); protected: FishingJoyData(); ~FishingJoyData(); bool init(); };
FishingJoyData.cpp
#include "FishingJoyData.h" #include "StaticData.h" //为方法我们定义一个宏CCUD减少代码量 #define CCUD CCUserDefault::sharedUserDefault() //初始化一个单例 static FishingJoyData* _sharedFishingJoyData = NULL; FishingJoyData* FishingJoyData::sharedFishingJoyData() { if (_sharedFishingJoyData == NULL) { _sharedFishingJoyData = new FishingJoyData(); _sharedFishingJoyData->init(); } return _sharedFishingJoyData; }
void FishingJoyData::purge() { //CC_SAFE_RELEASE_NULL使用release()方法释放Cocos2d-x对象p的一次引用,再把p赋值为NULL。如果p已经为NULL,则不进行操作 CC_SAFE_RELEASE_NULL(_sharedFishingJoyData); }
FishingJoyData::FishingJoyData() { } FishingJoyData::~FishingJoyData() { //将数据写入本地的方法,这个方法是为了实现自动保存,析构函数的方法是在这个类被释放前调用的 this->flush(); }
bool FishingJoyData::init() { _isBeginner = CCUserDefault::sharedUserDefault()->getBoolForKey("beginner"); if (_isBeginner) { //初始化时先重置 this->reset(); //保存初始化之后的数据 this->flush(); //初始化一次之后,只要不重置就用再初始化了 this->setIsBeginner(false); } else { _isBeginner = CCUD->getBoolForKey("beginner"); _soundVolume = CCUD->getFloatForKey("sound"); _musicVolume = CCUD->getFloatForKey("music"); _gold = CCUD->getIntegerForKey("gold"); //purgeSharedUserDefault()方法的意思是将CCUserDefault::sharedUserDefault()这个系统提供存放数据的单例类释放掉 CCUD->purgeSharedUserDefault(); } return true; }
void FishingJoyData::reset() { //STATIC_DATA_INT这个宏定义是定义在StaticData类中 int gold = STATIC_DATA_INT("default_gold"); this->setGlod(gold); this->setIsBeginner(true); this->setMusicVolume(1); this->setSoundVolume(1); //将以上数据初始化以后调本类中的保存数据的方法 this->flush(); } //设置金币的值 void FishingJoyData::alterGold(int delta) { this->setGlod(this->getGlod() + delta); }
void FishingJoyData::flush() { //以上在reset()方法中重新设置了以下参数的值,所以再次调用时就会被重新初始化 CCUD->setFloatForKey("sound", this->getSoundVolume()); CCUD->setBoolForKey("beginner", this->getIsBeginner()); CCUD->setIntegerForKey("gold", this->getGlod()); CCUD->setFloatForKey("music", this->getMusicVolume()); //这里大家可能会有一个疑问为什么先调用flush()保存之后再调用purgeSharedUserDefault()方法删除呢? //因为flush()方法可以将程序中缓存的数据写入本地的plist文件中,这个文件的储存的路径是有系统提供的。 CCUD->flush(); //purgeSharedUserDefault()是将程序中缓存的数据删除,不会删除用flush()方法写入到本地的数据 CCUD->purgeSharedUserDefault(); }