Cocos2d-x数据相关的类用法简介

33 篇文章 1 订阅

在Cocos2d-x的学习和使用中,我遇到了很多关于数据的操作。在这个过程中,我学习了Cocos2d-x自带的很多功能。下面我把接触到的类罗列在下面,给出的都是基本的用法,多数没有深入了解。


UserDefault

UserDefault类就像一个小型的数据库,它可以被用来存储一些键值对。而且由于是单例模式,你可以在程序的任何地方使用这些数据。


头文件

1
#include "base/CCUserDefault.h"


数据的存储

1
2
3
4
5
UserDefault *ud = UserDefault::getInstance();
// 从输入框中读取出字符串并加入到UserDefault中
ud->setStringForKey( "username" , username->getStringValue());
ud->setStringForKey( "password" , password->getStringValue());
ud->flush();     // 将UserDefault中的内容写入到文件中


数据的读取

1
2
3
4
// 将存储的数据读入到文本框,如果数据已经存储到本地,可以直接读
username->setText(UserDefault::getInstance()->getStringForKey( "username" ));
password->setText(UserDefault::getInstance()->getStringForKey( "password" ));
FileUtils


FileUtils类包括了对文件常用的操作,如获取路径、判断是否存在等,有点类似于Java中的File类,但除此之外,它还可以从文件中读内容。用的比较多还是读取文件内容到字符串:

1
2
3
4
5
#include "platform/CCFileUtils.h"
if (FileUtils::getInstance()->isFileExist(filename))  
{  
     std::string data=FileUtils::getInstance()->getStringFromFile(filename);  
}


rapidjson

从Cocos2d-x 3.0开始开始自带rapidjson这个类,解析json文件变得方便了。下面的示例从json中读取带有玩家名字和得分的排行榜信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "json/rapidjson.h"  
#include "json/document.h"  
rapidjson::Document doc;   // 创建一个解析JSON的Document对象
doc.Parse<rapidjson::kParseDefaultFlags>(data.c_str());   // 假设数据存储在字符串data中
for ( int  i=0;i<doc.Size();i++)  
{   
     rapidjson::Value &v=doc[i];       
     std::string username;
     int  score; 
     if (v.HasMember( "username" ) && v.HasMember( "score" ))  
     {   
         username = v[ "username" ].GetString();   // 获取一个String属性
         score = v[ "score" ].GetInt();     // 获取一个int属性
         texts[i]->setText(username +  ": "  + std::to_string(score);   // 将int转成String,加到一个文本框中
     }  
}


NotificationCenter

同大多数学习者一样,我们一开始在层与层、场景与场景之间传递数据上面也很头疼,然后就在网上查到了这个类。他使用了观察者模式,只需要让一个类订阅另一个类的消息,就可以实现数据的传递。


在下面这个示例中,希望将CharacterLayer中的血量、生命数等传递到HUDLayer中显示。


CharacterLayer

1
2
NotificationCenter::getInstance()->postNotification( "loseHeroLife" ,NULL);    // 传递生命数减少的消息,没有传递额外的对象
NotificationCenter::getInstance()->postNotification( "getHealth" ,heroHealth);     // 传递此时的血量,heroHealth对象中存储了血量的信息


HUDLayer

1
2
NotificationCenter::getInstance()->addObserver( this ,callfuncO_selector(HUDLayer::loseHeroLife), "loseHeroLife" ,NULL);     // 在loseHeroLife中将显示的红心减一
NotificationCenter::getInstance()->addObserver( this ,callfuncO_selector(HUDLayer::getHealth), "getHealth" ,NULL);   // 从接收到的heroHealth更新血槽的显示


绑定的处理方法应该是这个样子的:

1
2
3
void  HUDLayer::getHealth(Object* pSender){
     heroHealth = (Health*)pSender;
}


HttpClient

下面就是数据通过网络传输的内容了。HttpClient及相关类可以实现发送Http请求及接收响应。以用户注册的代码为例:

1
2
3
4
5
6
7
8
HttpRequest* request =  new  HttpRequest();  
std::string url = LOGIN_SERVER_URL + username_s +  "/"  + password_s;
request->setUrl(url.c_str());  
request->setRequestType(HttpRequest::Type::GET);  
// 还可以使用request->setRequestData("a", 0)的方式设置参数,这里没有用到  
request->setResponseCallback( this , httpresponse_selector(LoginScene::onHttpRequestCompleted));    
HttpClient::getInstance()->send(request);  
request->release();


onHttpRequestCompleted是一个回调方法,用于处理Http响应。它长这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void  LoginScene::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response) {  
     if (!response || !response->isSucceed())
         return ;
     // 获取响应中的内容
     std::vector< char >* buffer = response->getResponseData();  
     std::stringstream ss;
     for ( int  i=0;i<buffer->size();i++){
         ss << (*buffer)[i];
     }
     // 做相应处理
     if (ss.str() == ”success“){
         // 登录成功
     } else {
         // 登录失败
     }
}



来源网址:http://blog.segmentfault.com/codecabin/1190000000609378

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值