(搬运自我在SegmentFault的博客)

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

UserDefault

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

头文件:

#include "base/CCUserDefault.h"

数据的存储:

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

数据的读取:

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

FileUtils

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

#include "platform/CCFileUtils.h"

if(FileUtils::getInstance()->isFileExist(filename))
{
std::string data=FileUtils::getInstance()->getStringFromFile(filename);
}

更多FileUtils的用法可以看这篇文章

rapidjson

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

#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:

NotificationCenter::getInstance()->postNotification("loseHeroLife",NULL);	// 传递生命数减少的消息,没有传递额外的对象

NotificationCenter::getInstance()->postNotification("getHealth",heroHealth);	// 传递此时的血量,heroHealth对象中存储了血量的信息

HUDLayer:

NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(HUDLayer::loseHeroLife),"loseHeroLife",NULL);	// 在loseHeroLife中将显示的红心减一

NotificationCenter::getInstance()->addObserver(this,callfuncO_selector(HUDLayer::getHealth),"getHealth",NULL);	// 从接收到的heroHealth更新血槽的显示

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

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

HttpClient

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

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响应。它长这个样子:

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{
// 登录失败
}

}

Cocos2d-x数据相关的类用法简介(附示例)的更多相关文章

  1. C#中IPAddress类/Dns类/IPHostEntry类/IPEndPoint用法简介

    C#中IPAddress类/Dns类/IPHostEntry类/IPEndPoint用法简介 IP是一种普遍应用于因特网.允许不同主机能够相互找到对方的寻址协议.IP地址由4个十进制的数字号码所组成, ...

  2. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  3. 18、面向对象基本原则及UML类图简介

    18.1.面向对象基本原则 18.1.1.面向抽象原则 抽象类特点: a.抽象类中可以有abstract方法,也可以有非abstract方法. b.抽象类不能用new运算符创建对象. c.如果一个非抽 ...

  4. android中与SQLite数据库相关的类

    为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...

  5. Java工具类——数学相关的类

    Java工具类--数学相关的类 在上一篇文章中,我们系统学习了 Java 里面的包装类,那么这篇文章,我们就来学习一下Java提供好的类--数学相关的类. 一.数学类介绍 在最早期学习 Java 基础 ...

  6. Hibernate 系列 04 - Hibernate 配置相关的类

    引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...

  7. Apache自带压力测试工具ab用法简介

    ab命令原理 ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL进行访问.它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx.lighthttp ...

  8. 模拟在内存中的数据库DataSet相关的类

    这篇连着上一篇DataReader相关类. 下面两段话是在msdn官网摘下来:       .NET Framework 数据提供程序是专门为数据操作以及快速.只进.只读访问数据而设计的组件.Conn ...

  9. C# 中Datatime类用法总结

    C# 中Datatime类用法总结 收集了一些记录下来,这些有的是从网上找的,有些是自己使用到的: DateTime dt = DateTime.Now; dt.ToString();//2005-1 ...

随机推荐

  1. 微信小程序运行机制

    对于扫描接口B生成的带参小程序码的问题: (1)线上版本 扫描不同带参的小程序码会重新执行小程序的整个注册程序生命周期(详细生命周期函数见官方文档), (2)扫描相同的二维码的时候,目前微信官方给出的 ...

  2. Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift

    Python 如何连接并操作 Aws 上 PB 级云数据仓库 Redshift 一.简介 Amazon Redshift 是一个快速.可扩展的数据仓库,可以简单.经济高效地分析数据仓库和数据湖中的所有 ...

  3. yzm10的ACM集训小感

    7月30号,ACM集训进行了两周,一切都已on the right way.这时的我适时地从题海中探出头,其实除了刷题,也该写点什么来总结下过去.首先,在第一周里,我学习了数据结构,知道了STL这么一 ...

  4. 苦逼三流小公司程序员这半年找工作经历(3)——选择offer

    本文按照企业规模.性质.规模,分成三类,点评一下遇到的这些公司.也算是为半年找工作经历的一个总结. 1,三流小公司 公司规模类似于笔者跳槽前所在企业,性质有外商独资.合资,当然大多数都是民营企业,规模 ...

  5. Light Pre-Pass 渲染器----为多光源设计一个渲染器

    http://blog.csdn.net/xoyojank/article/details/4460953 作者: Wolfgang Engel, 原文: http://www.wolfgang-en ...

  6. Codevs 1257 打砖块

    1257 打砖块 http://codevs.cn/problem/1257/ 题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有 ...

  7. selenium+Python搭建

    安装环境:windows 7 64位   1.安装python,版本为python2.7 1)下载安装包. 在python官方网站选择下载python2版本的windows安装包:python-2.7 ...

  8. 关于HTML5用SVG画图

    SVG在HTML5中的应用 SVG(Scalable Vector Graphics)是用来绘制矢量图的HTML5标签.只要定义好XML属性就能够获得与其一致的图像元素. 使用SVG之前先将标签加入到 ...

  9. JS实现动态瀑布流及放大切换图片效果(js案例)

    整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击 ...

  10. 一个小时学会 MySQL 数据库

    随着移动互联网的结束与人工智能的到来大数据变成越来越重要,下一个成功者应该是拥有海量数据的,数据与数据库你应该知道. 一.数据库概要 数据库(Database)是存储与管理数据的软件系统,就像一个存入 ...