How to save C++ Structure in Cocos2d-x 2.1.4, to save game state

Yes,I got the path by calling getWritablePath(). But I can not find the plist file in that folder.

cm Y wrote:

Yes,I got the path by calling getWritablePath(). But I can not find the plist file in that folder.

even I can’t find the plist under resource folder , but I am able to read and write the file.
I used it to save 2d array, to save the state of game, it works like charm.Tested on device with iOS7.

you can use below code to save the game state. continue it

void SleepyFiver::saveGameState()
{
CCLog(“saveGameState”);

player->eatTimeDiff=(Constant::millisecondNow()-player->lastTime)/1000;
//http://www.cocos2d-x.org/forums/6/topics/41246
//http://pastebin.com/W0n4j8ct
//http://www.cocos2d-x.org/reference/native-cpp/V2.2/d7/d5f/classcocos2d_1_1_c_c_dictionary.html
int gScore=gameDistance+coinCount*2+goldNuggetCount*10;
CCUserDefault::sharedUserDefault()->setIntegerForKey("CURRENT_DISTANCE", gameDistance);
CCUserDefault::sharedUserDefault()->setIntegerForKey("CURRENT_COIN", coinCount);
CCUserDefault::sharedUserDefault()->setIntegerForKey("CURRENT_SCORE", totalScore);
CCUserDefault::sharedUserDefault()->setIntegerForKey("CURRENT_GOLD_NUGGET", goldNuggetCount);
CCUserDefault::sharedUserDefault()->setIntegerForKey("CURRENT_NOTE", noteCount);



//CCArray* array=CCArray::create();
CCDictionary * dictSlippyFiver = new CCDictionary();
int count=obstacleFaceCount;

CCLog("player->ANIM_TYPE :%d",player->ANIM_TYPE);

dictSlippyFiver->setObject(CCString::createWithFormat("%d",count),"obstacleFaceCount");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",player->ANIM_TYPE),"ANIM_TYPE");
dictSlippyFiver->setObject(CCString::createWithFormat("%f",player->ANIM_SPEED),"ANIM_SPEED");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",speedCount),"speedCount");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",currentSpeed),"currentSpeed");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",gameDistance),"gameDistance");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",LiveCountRemain),"LiveCountRemain");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",coinCount),"coinCount");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",goldNuggetCount),"goldNuggetCount");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",noteCount),"noteCount");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",player->SPEED_COUNT),"SPEED_COUNT");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",player->SPEED_MODE),"SPEED_MODE");
dictSlippyFiver->setObject(CCString::createWithFormat("%f",speed),"SPEED");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",player->ANIM_JUMPING_MODE),"ANIM_JUMPING_MODE");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",player->eatTimeDiff),"eatTimeDiff");
dictSlippyFiver->setObject(CCString::createWithFormat("%d",totalScore),"totalScore");
if(isValleyStart)
{
	dictSlippyFiver->setObject(CCString::createWithFormat("%d",1),"isValleyStart");

}else
{
	dictSlippyFiver->setObject(CCString::createWithFormat("%d",2),"isValleyStart");
}
if(isValley)
{
	dictSlippyFiver->setObject(CCString::createWithFormat("%d",1),"isValley");

}else
{
	dictSlippyFiver->setObject(CCString::createWithFormat("%d",2),"isValley");
}
dictSlippyFiver->setObject(CCString::createWithFormat("%f",playerRunningPosY),"playerRunningPosY");



CCDictionary* 	dictPlayer=		new CCDictionary();
dictPlayer->setObject(CCString::createWithFormat("%f",player->getPositionX()),"x");
dictPlayer->setObject(CCString::createWithFormat("%f",player->getPositionY()),"y");
dictSlippyFiver->setObject(dictPlayer,"player");



CCArray* arrayObstacle=CCArray::create();
CCArray* arrayNote=CCArray::create();
CCArray* arrayCoin=CCArray::create();
CCArray* arrayGoldNugget=CCArray::create();
CCArray* arrayBackground=CCArray::create();

CCArray* array=	SleepyFiver::getChildren();
for (int var = 0; var < array->count(); ++var) {

	if(((CCSprite*)array->objectAtIndex(var))->getTag()==obstTag)
	{

		CCLog("Obstacle");
		CCDictionary* 	dictObstacle=		new CCDictionary();
		dictObstacle->setObject(CCString::createWithFormat("%f",((Obstacle*)array->objectAtIndex(var))->getPositionX()),"x");
		dictObstacle->setObject(CCString::createWithFormat("%f",((Obstacle*)array->objectAtIndex(var))->getPositionY()),"y");
		dictObstacle->setObject(CCString::createWithFormat("%d",((Obstacle*)array->objectAtIndex(var))->index),"index");
		arrayObstacle->addObject(dictObstacle);


	}else if(((CCSprite*)array->objectAtIndex(var))->getTag()==Bird::TAG_BIRD_A||((CCSprite*)array->objectAtIndex(var))->getTag()==Bird::TAG_BIRD_B)
	{

		CCLog("Bird");
		CCDictionary* 	dictObstacle=		new CCDictionary();
		dictObstacle->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictObstacle->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		dictObstacle->setObject(CCString::createWithFormat("%d",((CCSprite*)array->objectAtIndex(var))->getTag()),"index");
		arrayObstacle->addObject(dictObstacle);


	}else  if(((CCSprite*)array->objectAtIndex(var))->getTag()==noteSpriteTag)
	{
		CCLog("noteSpriteTag");
		CCDictionary* 	dictNote=new CCDictionary();
		dictNote->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictNote->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		arrayNote->addObject(dictNote);

	}else if(((CCSprite*)array->objectAtIndex(var))->getTag()==tagCoin)
	{
		CCLog("tagCoin");
		CCDictionary* 	dictCoin=new CCDictionary();
		dictCoin->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictCoin->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		arrayCoin->addObject(dictCoin);

	}else if(((CCSprite*)array->objectAtIndex(var))->getTag()==tagGoldNugget)
	{
		CCLog("tagGoldNugget");
		CCDictionary* 	dictGoldNugget=new CCDictionary();
		dictGoldNugget->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictGoldNugget->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		arrayGoldNugget->addObject(dictGoldNugget);

	}


	if(((CCSprite*)array->objectAtIndex(var))->getTag()==tagBackgroundSky)
	{
		CCDictionary* 	dictBackground=new CCDictionary();
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		dictBackground->setObject(CCString::createWithFormat("%d",tagBackgroundSky),"tag");

		arrayBackground->addObject(dictBackground);
		CCLog("arrayBackground count tagBackgroundSky: %d",arrayBackground->count());
	}
	else if(((CCSprite*)array->objectAtIndex(var))->getTag()==tagStartValley)
	{
		CCDictionary* 	dictBackground=new CCDictionary();
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		dictBackground->setObject(CCString::createWithFormat("%d",tagStartValley),"tag");

		arrayBackground->addObject(dictBackground);
		CCLog("arrayBackground count tagStartValley: %d",arrayBackground->count());
	}else if(((CCSprite*)array->objectAtIndex(var))->getTag()==tagEndValley)
	{
		CCDictionary* 	dictBackground=new CCDictionary();
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionX()),"x");
		dictBackground->setObject(CCString::createWithFormat("%f",((CCSprite*)array->objectAtIndex(var))->getPositionY()),"y");
		dictBackground->setObject(CCString::createWithFormat("%d",tagEndValley),"tag");
		arrayBackground->addObject(dictBackground);
		CCLog("arrayBackground count tagEndValley: %d",arrayBackground->count());

	}



}
dictSlippyFiver->setObject(arrayObstacle,"Obstacle");
dictSlippyFiver->setObject(arrayNote,"Note");
dictSlippyFiver->setObject(arrayCoin,"Coin");
dictSlippyFiver->setObject(arrayGoldNugget,"GoldNugget");
dictSlippyFiver->setObject(arrayBackground,"background");

dictSlippyFiver->writeToFile("Slippy_Fiver.xml");


std::string path=CCFileUtils::sharedFileUtils()->getWritablePath();
path.append("Slippy_Fiver.xml");
CCLog("Sleepy_Fiver.plist path: %s", path.c_str());
CCUserDefault::sharedUserDefault()->setStringForKey("PATH_FOR_CONTINUE_GAME",path);
if(dictSlippyFiver->writeToFile(path.c_str()))
{
	CCLog("Written file");
}else
{
	CCLog("Written Failed");
}

CCLog("Children count :%d",SleepyFiver::getChildren()->count());
//SleepyFiver::getChildren()
CCInteger* gs1=(CCInteger*)dictSlippyFiver->valueForKey("gameDistance");
CCLog("gameDistance: %d", gs1->getValue());

CCDictionary* dict=CCDictionary::createWithContentsOfFile(path.c_str());
CCLog("Dict: %d",dict->retainCount());
CCString* gs=(CCString*)dict->objectForKey("gameDistance");
CCLog("gameDistance: %d", gs->intValue());
CCLog("saveGameState end");

}

void SleepyFiver::initContinueGame()
{

CCLog("initContinueGame");
std::string path=CCUserDefault::sharedUserDefault()->getStringForKey("PATH_FOR_CONTINUE_GAME");
CCDictionary* dict=CCDictionary::createWithContentsOfFile(path.c_str());
CCLog("Dict: %d",dict->retainCount());
CCString* gs=(CCString*)dict->objectForKey("gameDistance");
CCLog("gameDistance: %d", gs->intValue());
CCLog("11");
obstacleFaceCount=((CCString*)dict->objectForKey("obstacleFaceCount"))->intValue();
CCLog("12");
player->ANIM_TYPE=((CCString*)dict->objectForKey("ANIM_TYPE"))->intValue();

CCLog("ANIM_TYPE %d",player->ANIM_TYPE);
player->ANIM_SPEED=((CCString*)dict->objectForKey("ANIM_SPEED"))->floatValue();
player->SPEED_COUNT=((CCString*)dict->objectForKey("SPEED_COUNT"))->floatValue();
player->SPEED_MODE=((CCString*)dict->objectForKey("SPEED_MODE"))->floatValue();
player->eatTimeDiff=((CCString*)dict->objectForKey("eatTimeDiff"))->intValue();
player->eatTimeDiff*=1000;
if(((CCString*)dict->objectForKey("isValley"))->intValue()==1)
{
	isValley=true;

}else
{
	isValley=false;
}
if(((CCString*)dict->objectForKey("isValleyStart"))->intValue()==1)
{
	isValleyStart=true;

}else
{
	isValleyStart=false;
}

playerRunningPosY=((CCString*)dict->objectForKey("playerRunningPosY"))->floatValue();

totalScore=((CCString*)dict->objectForKey("totalScore"))->intValue();


CCLog("12");
speedCount=((CCString*)dict->objectForKey("speedCount"))->intValue();
CCLog("13");
//speedCount=((CCString*)dict->objectForKey("speedCount"))->intValue();
gameDistance=((CCString*)dict->objectForKey("gameDistance"))->intValue();
//LiveCountRemain=((CCString*)dict->objectForKey("LiveCountRemain"))->intValue();
coinCount=((CCString*)dict->objectForKey("coinCount"))->intValue();
CCLog("14");
goldNuggetCount=((CCString*)dict->objectForKey("goldNuggetCount"))->intValue();
CCLog("15");
noteCount=((CCString*)dict->objectForKey("noteCount"))->intValue();

speed=((CCString*)dict->objectForKey("SPEED"))->floatValue();
player->ANIM_JUMPING_MODE=((CCString*)dict->objectForKey("ANIM_JUMPING_MODE"))->intValue();
CCLog("ANIM_JUMPING_MODE %d",player->ANIM_JUMPING_MODE);


CCLog("1");
//SleepyFiver::setLive(LiveCountRemain);

CCLabelTTF* label1 = (CCLabelTTF*)getChildByTag(scoreLabel);
ostringstream convert;   // stream used for the conversion
convert << totalScore;
label1->setString(convert.str().c_str());
CCLog("2");
player->setPosition(ccp(((CCString*)((CCDictionary*)dict->objectForKey("player"))->objectForKey("x"))->floatValue(),((CCString*)((CCDictionary*)dict->objectForKey("player"))->objectForKey("y"))->floatValue()));
if(player->ANIM_TYPE==Slippy::ANIM_IDLE)
{
	player->initWithSpriteFrame((CCSpriteFrame*)pilotAnimation->characterArr->objectAtIndex(0));


}else if(player->ANIM_TYPE==Slippy::ANIM_JUMP)
{
	player->initWithSpriteFrame((CCSpriteFrame*)pilotAnimation->characterArr->objectAtIndex(2));


}else if(player->ANIM_TYPE==Slippy::ANIM_RUN)
{
	CCAnimation* rumAnim=CCAnimation::createWithSpriteFrames
			(pilotAnimation->characterArr,player->ANIM_SPEED);
	player->runAction(CCRepeatForever::create(CCAnimate::create(rumAnim)));
	player->isRun=true;

}else if(player->ANIM_TYPE==Slippy::ANIM_JOGGING)
{

	CCLog("ANIM_JOGGING");
	player->runAction(CCSequence::create(CCCallFuncND::create(this,
			callfuncND_selector(SleepyFiver::jogging), NULL),CCDelayTime::create(pilotAnimation->arrayCountAnim->count()*player->countFreq),CCCallFuncND::create(this,
					callfuncND_selector(SleepyFiver::pauseOrPlayGame), NULL),NULL));
}else if(player->ANIM_TYPE==Slippy::ANIM_UNBOXING)
{
	CCAnimation* animBoxOpen1=CCAnimation::createWithSpriteFrames(pilotAnimation->arrayBoxOpen,player->boxOpenFreq);
	CCActionInterval* animBoxOpen=CCRepeat::create(CCAnimate::create(animBoxOpen1),1);

	CCLog("ANIM_UNBOXING");
	player->runAction(CCSequence::create(CCCallFuncND::create(this,callfuncND_selector(SleepyFiver::boxOpen),NULL), animBoxOpen,CCCallFuncND::create(this,
			callfuncND_selector(SleepyFiver::jogging), NULL),CCDelayTime::create(pilotAnimation->arrayCountAnim->count()*player->countFreq),CCCallFuncND::create(this,
					callfuncND_selector(SleepyFiver::pauseOrPlayGame), NULL),NULL));
}else if(player->ANIM_TYPE==Slippy::ANIM_SLIDE)
{
	//player->ANIM_TYPE=Slippy::ANIM_SLIDE;
	//player->stopAllActions();
	CCActionInterval* rotateTo=CCRotateTo::create(0.0f, -90);
	CCActionInterval* rotateToBack=CCRotateTo::create(0.0f,0);
	CCFiniteTimeAction*  action = CCSequence::create(rotateTo,CCDelayTime::create(0.40f),rotateToBack,CCCallFuncND::create(this,callfuncND_selector(SleepyFiver::GetPlayerDown),NULL),NULL);
	player->runAction(action);
	player->setPositionY(playerSlidingPosY);
}
CCLog("3");

CCArray* arrNote=(CCArray*)((CCDictionary*)dict)->objectForKey("Note");
if(arrNote->count()>0)
{
	CCLog("gameDistance: %d", gs->intValue());
	for (int var = 0; var < arrNote->count();++var) {
		CCDictionary* dict	=(CCDictionary*)arrNote->objectAtIndex(var);
		//SleepyFiver::addNote(0.01);
		noteSprite->setPosition(ccp(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue(),((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue()));

	}
}
CCLog("4");
CCArray* arrObstacle=(CCArray*)((CCDictionary*)dict)->objectForKey("Obstacle");
if(arrObstacle->count()>0)
{
	for (int var = 0; var <arrObstacle->count(); ++var) {
		CCDictionary* dict	=(CCDictionary*)arrObstacle->objectAtIndex(var);
		SleepyFiver::addTargetContinueGame(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue(),((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue(),((CCString*)(CCDictionary*)dict->objectForKey("index"))->intValue());
	}
}
CCLog("5");
CCArray* arrCoin=(CCArray*)((CCDictionary*)dict)->objectForKey("Coin");
if(arrCoin->count()>0)
{
	for (int var = 0; var <arrCoin->count(); ++var) {
		CCDictionary* dict	=(CCDictionary*)arrCoin->objectAtIndex(var);
		SleepyFiver::addCoinContinueGame(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue(),((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue(),tagCoin);;
	}
}
CCArray* arrGoldNugget=(CCArray*)((CCDictionary*)dict)->objectForKey("GoldNugget");
if(arrGoldNugget->count()>0)
{
	for (int var = 0; var <arrGoldNugget->count(); ++var) {
		CCDictionary* dict	=(CCDictionary*)arrGoldNugget->objectAtIndex(var);
		SleepyFiver::addCoinContinueGame(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue(),((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue(),tagGoldNugget);;
	}
}
CCArray* arrBackground=(CCArray*)((CCDictionary*)dict)->objectForKey("background");
CCLog("arrayBackground count : %d",arrBackground->count());
//	if(arrBackground->count()==_backGround->count())
//	{
//
//		for (int var = 0; var <arrBackground->count(); ++var) {
//			CCDictionary* dict	=(CCDictionary*)arrBackground->objectAtIndex(var);
//			((Background*)_backGround->objectAtIndex(var))->setPositionX(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue());//,((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue()));
//		}
//	}


for (int var = 0; var <arrBackground->count(); ++var)
{
	//(((CCDictionary*)dict)->objectForKey("tag"))->

	CCDictionary* dict	=(CCDictionary*)arrBackground->objectAtIndex(var);
	if(((CCString*)((CCDictionary*)dict)->objectForKey("tag"))->intValue()==tagBackgroundSky)
	{

		((Background*)_backGround->objectAtIndex(var))->setPositionX(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue());//,((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue()));
	}else if(((CCString*)((CCDictionary*)dict)->objectForKey("tag"))->intValue()==tagStartValley)
	{
		float scale =Constant::getValleyScale(screenSize);

		Background* startValley=Background::create("gameplay_screen_valley_start.png");
		startValley->setScale(scale);
		startValley->BackgroundSize=CCSizeMake(startValley->getContentSize().width*scale,startValley->getContentSize().height*scale);
		addChild(startValley,ZOrderGroundSky,tagStartValley);
		_backGround->addObject(startValley);
		schedule(schedule_selector(SleepyFiver::endValley),(4+rand()%4));
		startValley->setPosition(ccp(0,startValley->BackgroundSize.height*.50));
		startValley->setPositionX(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue());//,((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue()));
		schedule(schedule_selector(SleepyFiver::endValley),(1+rand()%2));

	}else if(((CCString*)((CCDictionary*)dict)->objectForKey("tag"))->intValue()==tagEndValley)
	{
		unschedule(schedule_selector(SleepyFiver::endValley));
		float scale =Constant::getValleyScale(screenSize);
		Background* endValley=Background::create("gameplay_screen_valley_end.png");
		endValley->setScale(scale);
		endValley->BackgroundSize=CCSizeMake(endValley->getContentSize().width*scale,endValley->getContentSize().height*scale);
		_backGround->addObject(endValley);
		endValley->setPosition(ccp(winSize.width,endValley->getContentSize().height*scale*.50));
		addChild(endValley,ZOrderGroundSky,tagEndValley);
		endValley->setPositionX(((CCString*)((CCDictionary*)dict)->objectForKey("x"))->floatValue());//,((CCString*)(CCDictionary*)dict->objectForKey("y"))->floatValue()));
	}
}


CCLog("7");
if(player->ANIM_TYPE!=Slippy::ANIM_JOGGING&&player->ANIM_TYPE!=Slippy::ANIM_UNBOXING)
{
	SleepyFiver::pauseOrPlayGame();
}

}