转载请表明地址:http://blog.csdn.net/jackystudio/article/details/12036237

作为一个单机游戏,连分数存储的的功能都没有,让它怎么在单机游戏圈里混,其它单机游戏又会怎么看它,这么碎节操的事不能干。。。

好吧,不废话。。。这篇就要针对游戏分数来介绍数据的本地存储。至于具体在哪里实现,因为涉及开场场景和结束场景的设计,篇幅有限,就先不写,这里讨论怎么实现。

1.分数的设计

在GameLayer层增加成员变量。

int score;//实时分数

在GameOverLayer层增加成员变量,这层是游戏结束画面,放在GameOverScene中,后面会介绍。

static int highestHistoryScore;//历史最高分

(1)highestHistoryScore是游戏一开始读取出来的历史最高分,这个值除非在刷新记录后才会变化,否则是不变的。

(2)score是当前局游戏的分数,影响到它的有:

A.初始化为0。

B.命中敌机增加相应的分数(3种)。

C.炸弹ufo全局秒杀增加相应分数。

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)即可实现,这里就不说了。或者你有兴趣自己写加密解密算法,也是不错的选择。

效果图:

[置顶] 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储的更多相关文章

  1. [置顶] 【cocos2d-x入门实战】微信飞机大战之六:子弹层的处理

    这一篇将会处理完子弹层的其他要点. 1.子弹的初始位置 子弹的初始位置在飞机的机头位置,因为飞机在游戏的过程中会随着玩家的触摸而改变其位置,所以,子弹的初始位置只能以当前飞机位置为基准进行添加. CC ...

  2. [置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11730601 不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉. 1 ...

  3. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197 在整个游戏开始之前,我们先看一下HelloWorld示例中CCSce ...

  4. [置顶] 【cocos2d-x入门实战】微信飞机大战之四:飞机登场咯

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11757175 昨天收到了电子工业出版社寄过来的<cocos2d-x游戏开发之 ...

  5. [置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043 游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了. 欢 ...

  6. 【一】仿微信飞机大战cocos2d-x3.0rc1

    參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...

  7. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...

  8. Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

    看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...

  9. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

随机推荐

  1. NYOJ128 前缀式计算 【栈】

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...

  2. C语言随记-1

    涉及指针.数组.函数指针 几种声明形式 int *a[5]; // a是一个有5个元素的数组,每个元素是整数类型指针(int *) int *a[] = {0x100, 0x104, 0x108, 0 ...

  3. My way on Linux - [虚拟化&云计算] - 云计算概述&KVM虚拟化基础

    思维导图

  4. HTML5 prefetch即预加载

    原文地址 声明:此文带着自己的理解,不完全按原文翻译 prefetch 即预加载,在用户需要前我们就将所需的资源加载完毕. 有了浏览器缓存,为何还需要预加载? 用户可能是第一次访问网站,此时还无缓存 ...

  5. FineUI控件之树的应用(二)

    一.Tree控件应用 <f:PageManager ID="PageManager1" runat="server" /> <f:Tree I ...

  6. hdu 1234

    Problem Description 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签 到.签离记录,请根据记录找出当天开门和关门的人. Input 测试输入的第一行 ...

  7. Jlink仿真器下载程序时出现Invalid ROM table!

    原因:仿真器时钟设置不对,应该将时间改低一点.

  8. ESP8266固件烧录方法

    今天拿到ESP8266的板子,第一步是进行烧录固件. 首先是使用官方自带的参考文档,进行操作.发现每次烧录均卡在等待同步上电. 之后发现是烧录方法错误. 正确的烧录方法: 先按下FLASH不放,再按烧 ...

  9. [转载]Git常用命令

    转载自: Git常用命令 Git配置 git config --global user.name "robbin" git config --global user.email & ...

  10. HDU 3966 dfs序+LCA+树状数组

    题目意思很明白: 给你一棵有n个节点的树,对树有下列操作: I c1 c2 k 意思是把从c1节点到c2节点路径上的点权值加上k D c1 c2 k 意思是把从c1节点到c2节点路径上的点权值减去k ...