博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Cocos2d-x中数据的存储
阅读量:5359 次
发布时间:2019-06-15

本文共 2517 字,大约阅读时间需要 8 分钟。

 

当局分数的打印和最高分数的记录

1.首先定义一个Label类型的节点在GameScene.cpp的init方法中,设置初始分数为0

_myScore = 0;

scorelabel = Label::createWithSystemFont("Score: 0", "Arial", 36);
scorelabel->setAnchorPoint(Vec2(1, 0));
scorelabel->setColor(Color3B::BLACK);
scorelabel->setPosition(size.width, size.height - scorelabel->getContentSize().height); 
this->addChild(scorelabel,2);

 

2.当满足某个加分条件时,改变Label的文本值(没必要放在什么Update方法中,效率太低)

//如果敌方飞机挂了,玩家增加分数,加1分

_myScore += 1;
char buf[100] = { 0 };
sprintf(buf, "Score: %d", _myScore);
scorelabel->setString(buf);

 

3.满足游戏结束的条件时执行publishScore();方法,把这局游戏的分数存储到一个UserDefault.XML文件里面,这个UserDefault.XML文件是Cocos2d-x自己可以设计生成的一个小型数据库文件,更多的时候是用来记录玩家的最高记录时使用的。

//如果玩家生命值为0,游戏结束

publishScore(); //满足游戏结束的条件时执行

 

void GameScene::publishScore()

{
  auto userdefault = UserDefault::getInstance();

  //查看路径,测试用

  //log(userdefault->getXMLFilePath().c_str());

  //存储本次游戏分数

  char score_str[100] = { 0 };
  sprintf(score_str, "%d", _myScore);
  userdefault->setStringForKey("LastScore", score_str);

  //存储最佳游戏分数

  auto bestscore = userdefault->getStringForKey("BestScore");
  if (_myScore > atoi(bestscore.c_str()))
  userdefault->setStringForKey("BestScore", score_str);
}

 

4.在游戏结束的界面GameOver.cpp的init方法中,添加两个Label节点,分别打印出这局游戏的最终分数以及玩家的最高分数。

//显示本次分数,位于中间

auto score = UserDefault::getInstance()->getStringForKey("LastScore");

auto labelscore = Label::createWithTTF(score, "fonts/Marker Felt.ttf", 36);

labelscore->setColor(Color3B::BLACK);

labelscore->setPosition(Vec2(labelscore->getContentSize().width / 2 + 50, visibleSize.height - labelscore->getContentSize().height / 2 - 120));

addChild(labelscore);

//显示最佳分数,位于左上
auto bestscore = UserDefault::getInstance()->getStringForKey("BestScore");

auto labelbestscore = Label::createWithSystemFont(bestscore, "Arial", 36);

labelbestscore->setColor(Color3B::BLACK);

labelbestscore->setPosition(Vec2(labelbestscore->getContentSize().width / 2 + 50, visibleSize.height - labelbestscore->getContentSize().height / 2 - 80));

addChild(labelbestscore);

 

 

注意:

1.记录最高分数是记录在UserDefault.XML文件中,所以关掉游戏,下次再打开,还是那个最高分数,这个和C/C++中文件操作的原理差不多。要想知道UserDefault.XML文件在哪里,可以用测试语句打印出UserDefault.XML文件的路径

//查看路径,测试用

log(userdefault->getXMLFilePath().c_str());

这个例子的路径是在

C:/Users/Administrator/AppData/Local/NoOneDies_st/UserDefault.xml

所以一般都是在C:/Users/Administrator/AppData/Local/游戏名/UserDefault.xml这种格式的路径下,就算删除了,下次运行游戏的时候也会自动再生成,不过最高分数会变成0,这种做法也可以用在平时写代码清零的时候,删一删这个文件。不然不管你开游戏关游戏多少次,最高分数还是那个,不会改变的,已经记录在我们电脑的文件上了。

 

2.如果Label无缘无故不显示在场景的层中,很可能是因为和场景的层的颜色一样,导致看不见。

 

转载于:https://www.cnblogs.com/HangZhe/p/5793310.html

你可能感兴趣的文章
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
回到顶部浮窗设计
查看>>
C#中Monitor和Lock以及区别
查看>>