[置頂] 【cocos2d-x入門實戰】微信飛機大戰之十二:分數的本地存儲

轉載請代表地址:http://blog.csdn.net/jackystudio/article/details/12036237
算法

做爲一個單機遊戲,連分數存儲的的功能都沒有,讓它怎麼在單機遊戲圈裏混,其它單機遊戲又會怎麼看它,這麼碎節操的事不能幹。。。字體

好吧,不廢話。。。這篇就要針對遊戲分數來介紹數據的本地存儲。至於具體在哪裏實現,由於涉及開場場景和結束場景的設計,篇幅有限,就先不寫,這裏討論怎麼實現。this


1.分數的設計

在GameLayer層增長成員變量。google

 

int score;//實時分數

 

在GameOverLayer層增長成員變量,這層是遊戲結束畫面,放在GameOverScene中,後面會介紹。加密

 

static int highestHistoryScore;//歷史最高分

 

(1)highestHistoryScore是遊戲一開始讀取出來的歷史最高分,這個值除非在刷新記錄後纔會變化,不然是不變的。spa

(2)score是當前局遊戲的分數,影響到它的有:.net

A.初始化爲0。設計

B.命中敵機增長相應的分數(3種)。code

C.炸彈ufo全局秒殺增長相應分數。orm


2.分數的顯示和更新

如昨天所言,分數顯示在ControlLayer這一層中,以下

 

//在ControlLayer的init加入score
scoreItem=CCLabelBMFont::create("0","font/font.fnt");//scoreItem是CCLabelBMFont*型成員變量,這裏採用了自定義的字體,相關資源在第一篇有給出了
scoreItem->setColor(ccc3(143,146,147));
scoreItem->setAnchorPoint(ccp(0,0.5));
scoreItem->setPosition(ccp(pPauseItem->getPositionX()+normalPause->getContentSize().width/2+5,pPauseItem->getPositionY()));
this->addChild(scoreItem);

分數的更新也由ControlLayer提供接口

 

 

//更新分數
void ControlLayer::updateScore(int score)
{
	if (score>=0 && score<=MAX_SCORE)//設置一個最大值20億
	{
		CCString* strScore=CCString::createWithFormat("%d",score);//格式化爲字符串
		scoreItem->setString(strScore->m_sString.c_str());//從CCString中得到char*,更新分數
	}
}

 


3.分數更新的調用

這裏舉的例子是Enmey3和Bullet碰撞後的檢測,如下這段代碼能夠在第九篇:碰撞檢測中找到http://blog.csdn.net/jackystudio/article/details/11917875

 

//若是life==1,移除enemy3,
else if(enemy3->life==1)
{
	enemy3->life--;
	mutiBulletsToDelete->addObject(mutiBullets);
	enemy3sToDelete->addObject(enemy3);
	score+=ENEMY3_SCORE;//增長分數,ENMEY3_SCORE是一個宏,值是擊落敵機3得到的分數
	this->controlLayer->updateScore(score);//調用ControlLayer的updateScore更新分數
}

 

4.分數的本地存儲

 

分數的存儲,其實就是在本地保存一個xml的文本,記錄相關數據。有點相似ini文件,遊戲中只有在如下幾個地方用到:

(1)進入遊戲,讀取歷史最高分,若是沒有存檔(第一次進遊戲或者文檔被刪除),從新寫存檔,初始分數默認爲0。

(2)遊戲結束,比較歷史最高分和當前分數,若是當前分數超過了歷史最高分,設置當前分數爲歷史最高分,從新寫入存檔。

這裏用到的類是CCUserDefault。


4.1.獲取歷史最高分

WelcomeLayer屬於開場場景

 

bool WelcomeLayer::isHaveSaveFile()//判斷存檔是否存在
{
	if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))//經過設置的bool型標誌位判斷,若是不存在
	{
		CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true);//寫入bool判斷位
		CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",0);//寫入初始分數0
		CCUserDefault::sharedUserDefault()->flush();//設置完必定要調用flush,才能從緩衝寫入io
		return false;
	}
	else
	{
		return true;
	}
}

void WelcomeLayer::getHighestHistorySorce()
{
	if (isHaveSaveFile())//若是存在存檔
	{
		GameOverLayer::highestHistoryScore=CCUserDefault::sharedUserDefault()->getIntegerForKey("HighestScore",0);//讀取歷史最高分
	}
}

 

4.2.設置新的最高分

 

 

//GameOver層中調用
if (score>highestHistoryScore)
{
	CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",score);//修改存檔
	//...其餘東西
}

 

5.數據的加密存儲

 

在遊戲目錄下能夠找到這麼一個文件UserDefault.xml,就能夠看到isHaveSaveFileXml和HighestScore這兩個值,若是人人均可以修改了它,分數就能夠造假了。


那怎麼辦?

加密唄。google一份Base64的C++源碼(.h和.cpp),添加到工程中,直接調用API(Encode和Decode)便可實現,這裏就不說了。或者你有興趣本身寫加密解密算法,也是不錯的選擇。

效果圖:

相關文章
相關標籤/搜索