作為一個單機游戲,連分數(shù)存儲的的功能都沒有,讓它怎么在單機游戲圈里混,其它單機游戲又會怎么看它,這么碎節(jié)操的事不能干。。。
好吧,不廢話。。。這篇就要針對游戲分數(shù)來介紹數(shù)據(jù)的本地存儲。至于具體在哪里實現(xiàn),因為涉及開場場景和結(jié)束場景的設(shè)計,篇幅有限,就先不寫,這里討論怎么實現(xiàn)。
在GameLayer層增加成員變量。
int score;//實時分數(shù)
在GameOverLayer層增加成員變量,這層是游戲結(jié)束畫面,放在GameOverScene中,后面會介紹。
static int highestHistoryScore;//歷史最高分
(1)highestHistoryScore是游戲一開始讀取出來的歷史最高分,這個值除非在刷新記錄后才會變化,否則是不變的。
(2)score是當前局游戲的分數(shù),影響到它的有:
A.初始化為0。
B.命中敵機增加相應(yīng)的分數(shù)(3種)。
C.炸彈ufo全局秒殺增加相應(yīng)分數(shù)。
如昨天所言,分數(shù)顯示在ControlLayer這一層中,如下
//在ControlLayer的init加入score
scoreItem=CCLabelBMFont::create("0","font/font.fnt");//scoreItem是CCLabelBMFont*型成員變量,這里采用了自定義的字體,相關(guān)資源在第一篇有給出了
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);
分數(shù)的更新也由ControlLayer提供接口
//更新分數(shù)
void ControlLayer::updateScore(int score)
{
if (score>=0 && score<=MAX_SCORE)//設(shè)置一個最大值20億
{
CCString* strScore=CCString::createWithFormat("%d",score);//格式化為字符串
scoreItem->setString(strScore->m_sString.c_str());//從CCString中獲得char*,更新分數(shù)
}
}
這里舉的例子是Enmey3和Bullet碰撞后的檢測,以下這段代碼可以在[第九篇:碰撞檢測][1]中找到。
//如果life==1,移除enemy3
else if(enemy3->getLife()==1)
{
enemy3->loseLife();
bulletsToDelete->addObject(bullet);
enemy3sToDelete->addObject(enemy3);
score+=ENEMY3_SCORE;
this->controlLayer->updateScore(score);//更新分數(shù)
}
分數(shù)的存儲,其實就是在本地保存一個xml的文本,記錄相關(guān)數(shù)據(jù)。有點類似ini文件,游戲中只有在以下幾個地方用到:
(1)進入游戲,讀取歷史最高分,如果沒有存檔(第一次進游戲或者文檔被刪除),重新寫存檔,初始分數(shù)默認為0。
(2)游戲結(jié)束,比較歷史最高分和當前分數(shù),如果當前分數(shù)超過了歷史最高分,設(shè)置當前分數(shù)為歷史最高分,重新寫入存檔。
這里用到的類是CCUserDefault。
WelcomeLayer屬于開場場景
bool WelcomeLayer::isHaveSaveFile()//判斷存檔是否存在
{
if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))//通過設(shè)置的bool型標志位判斷,如果不存在
{
CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true);//寫入bool判斷位
CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",0);//寫入初始分數(shù)0
CCUserDefault::sharedUserDefault()->flush();//設(shè)置完一定要調(diào)用flush,才能從緩沖寫入io
return false;
}
else
{
return true;
}
}
void WelcomeLayer::getHighestHistorySorce()
{
if (isHaveSaveFile())//如果存在存檔
{
GameOverLayer::highestHistoryScore=CCUserDefault::sharedUserDefault()->getIntegerForKey("HighestScore",0);//讀取歷史最高分
}
}
//GameOver層中調(diào)用
if (score>highestHistoryScore)
{
CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",score);//修改存檔
highestHistoryScore=score//最高分重新設(shè)定...后面還有其他東西
}
在游戲目錄下可以找到這么一個文件UserDefault.xml,就可以看到isHaveSaveFileXml和HighestScore這兩個值,如果人人都可以修改了它,分數(shù)就可以造假了。
那怎么辦?
加密唄。google一份Base64的C++源碼(.h和.cpp),添加到工程中,直接調(diào)用API(Encode和Decode)即可實現(xiàn),這里就不說了?;蛘吣阌信d趣自己寫加密解密算法,也是不錯的選擇。
效果圖:
更多建議: