Cocos2d-x 分?jǐn)?shù)的本地存儲(chǔ)

2018-10-02 09:55 更新

分?jǐn)?shù)的本地存儲(chǔ)

作為一個(gè)單機(jī)游戲,連分?jǐn)?shù)存儲(chǔ)的的功能都沒有,讓它怎么在單機(jī)游戲圈里混,其它單機(jī)游戲又會(huì)怎么看它,這么碎節(jié)操的事不能干。。。

好吧,不廢話。。。這篇就要針對(duì)游戲分?jǐn)?shù)來(lái)介紹數(shù)據(jù)的本地存儲(chǔ)。至于具體在哪里實(shí)現(xiàn),因?yàn)樯婕伴_場(chǎng)場(chǎng)景和結(jié)束場(chǎng)景的設(shè)計(jì),篇幅有限,就先不寫,這里討論怎么實(shí)現(xiàn)。

1.分?jǐn)?shù)的設(shè)計(jì)

在GameLayer層增加成員變量。

    int score;//實(shí)時(shí)分?jǐn)?shù)

在GameOverLayer層增加成員變量,這層是游戲結(jié)束畫面,放在GameOverScene中,后面會(huì)介紹。

    static int highestHistoryScore;//歷史最高分

(1)highestHistoryScore是游戲一開始讀取出來(lái)的歷史最高分,這個(gè)值除非在刷新記錄后才會(huì)變化,否則是不變的。

(2)score是當(dāng)前局游戲的分?jǐn)?shù),影響到它的有:

A.初始化為0。

B.命中敵機(jī)增加相應(yīng)的分?jǐn)?shù)(3種)。

C.炸彈ufo全局秒殺增加相應(yīng)分?jǐn)?shù)。

2.分?jǐn)?shù)的顯示和更新

如昨天所言,分?jǐn)?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);

分?jǐn)?shù)的更新也由ControlLayer提供接口

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

3.分?jǐn)?shù)更新的調(diào)用

這里舉的例子是Enmey3和Bullet碰撞后的檢測(cè),以下這段代碼可以在[第九篇:碰撞檢測(cè)][1]中找到。

//如果life==1,移除enemy3  
else if(enemy3->getLife()==1)  
{  
    enemy3->loseLife();  
    bulletsToDelete->addObject(bullet);  
    enemy3sToDelete->addObject(enemy3);  
    score+=ENEMY3_SCORE;  
    this->controlLayer->updateScore(score);//更新分?jǐn)?shù)  
} 

4.分?jǐn)?shù)的本地存儲(chǔ)

分?jǐn)?shù)的存儲(chǔ),其實(shí)就是在本地保存一個(gè)xml的文本,記錄相關(guān)數(shù)據(jù)。有點(diǎn)類似ini文件,游戲中只有在以下幾個(gè)地方用到:

(1)進(jìn)入游戲,讀取歷史最高分,如果沒有存檔(第一次進(jìn)游戲或者文檔被刪除),重新寫存檔,初始分?jǐn)?shù)默認(rèn)為0。

(2)游戲結(jié)束,比較歷史最高分和當(dāng)前分?jǐn)?shù),如果當(dāng)前分?jǐn)?shù)超過(guò)了歷史最高分,設(shè)置當(dāng)前分?jǐn)?shù)為歷史最高分,重新寫入存檔。

這里用到的類是CCUserDefault。

4.1.獲取歷史最高分

WelcomeLayer屬于開場(chǎng)場(chǎng)景

    bool WelcomeLayer::isHaveSaveFile()//判斷存檔是否存在
    {
        if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml"))//通過(guò)設(shè)置的bool型標(biāo)志位判斷,如果不存在
        {
            CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true);//寫入bool判斷位
            CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",0);//寫入初始分?jǐn)?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);//讀取歷史最高分
        }
    }

4.2.設(shè)置新的最高分

    //GameOver層中調(diào)用
    if (score>highestHistoryScore)
    {
        CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",score);//修改存檔
        highestHistoryScore=score//最高分重新設(shè)定...后面還有其他東西
    }

5.數(shù)據(jù)的加密存儲(chǔ)

在游戲目錄下可以找到這么一個(gè)文件UserDefault.xml,就可以看到isHaveSaveFileXml和HighestScore這兩個(gè)值,如果人人都可以修改了它,分?jǐn)?shù)就可以造假了。

那怎么辦?

加密唄。google一份Base64的C++源碼(.h和.cpp),添加到工程中,直接調(diào)用API(Encode和Decode)即可實(shí)現(xiàn),這里就不說(shuō)了?;蛘吣阌信d趣自己寫加密解密算法,也是不錯(cuò)的選擇。

效果圖:


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)