Cocos2d-x 捕鱼达人游戏学习教程(2)--动态数据模型的创建

时间:2023-02-08 10:50:37


本章的代码例子: 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();
}