转载请表明地址: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. Stm32高级定时器(三)

    Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...

  2. JQuery或JavaScript获取网页的宽度、高等

    最近多次使用JQery或JavaScript获取网页的宽度或者高度,在网上搜索N久之后发现很多都是粘贴上去并没有详细的介绍,这里我将会对经常使用的一些获取页面宽高的属性,方法做详细的介绍,以便能够更加 ...

  3. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

  4. SQL Server类型与C#类型对应关系

    SQL类型 C#类型 bit bool tinyint byte smallint short int int bigint long real float float double money de ...

  5. C#this的五种用法

    this的五种用法: 1.使用被掩盖的成员变量: class AA { int a; public void set1(int a) { this.a = a;//right } public voi ...

  6. django post方法不能提交

    def login(request): if request.method == 'GET': c = {} c.update(csrf(request)) return render_to_resp ...

  7. Yoga安装Ubuntu后,wifi和亮度调节问题

    http://askubuntu.com/questions/318608/lenovo-yoga-13-realtek-wireless-driver/358479#358479 http://it ...

  8. LeetCode_Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. 车的UML图

    车的UML图,涉及到集合与泛化的东东. UML统一建模语言,通过图能够很好的分析问题.

  10. Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件

    本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框.   Eclipse代码自动补全功能默认只包括 点"."  ,即只有输入”." ...