cocos2d-x基础 - 常用功能
1. 计时器
使用Schedule类来实现的计时器比较常用
首先创建一个Label:
label = Label::createWithSystemFont("文本内容", "Courier", 20);
addChild(label);
在HelloWorldScene.h中添加对update方法对重写:
virtual void update(float dt);
update方法里面时每一帧执行的操作:
// 每一帧执行的动作
void HelloWorld::update(float dt){
// 每次移动(1, 1)
label->setPosition(label->getPosition()+Point(1, 1));
if (label->getPosition().x > 200) {
label->setPosition(Point(0, 0));
}
}
在init()中添加如下内容来开启计时器:
scheduleUpdate(); // 永久执行update的内容
编译运行得到如下效果:
scheduleUpdate不常用,经常用的是另外两个:
可以指定时间间隔和重复次数、延迟
schedule(SEL_SCHEDULE selector, float interval);
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
例子:
首先在场景文件的头文件里创建一个timerHandler来确定计时器调用的函数
void timerHandler(float dt); // timerHandler
// --
// 计时器执行的函数
void HelloWorld::timerHandler(float dt){
log("输出");
}
然后在init中创建计时器:
schedule(schedule_selector(HelloWorld::timerHandler), 1);
schedule_selector是一个用来将函数创建为SEL_SCHEDULE类型的宏,传入刚才定义的计时器执行函数即可
编译运行,会在控制台每隔一秒输出信息,如下图:
2. 首选项数据读写
使用UserDefault类来处理数据的读写操作
首先可以创建某种类型的数据,即使在程序关闭之后,数据也会存在
UserDefault::getInstance()->setStringForKey("关键词key", "string数据内容");
这里创建的是string类型的数据
编译运行之后关闭程序,然后改写为如下:
log("%s", UserDefault::getInstance()->getStringForKey("关键词key", "default contains").c_str());
default contains是在通过关键词找不到数据的时候默认输出的内容
运行结果如下:
如果将"关键词key"改为"关键词key1",就会输出默认内容:
3. 文件读写
使用FileUtils类来实现文件读写操作
使用C++原生的文件操作也可以,但是在多平台上的兼容性不好
使用:
auto f = FileUtils::getInstance();
// f->getWritablePath(); // 得到可以写的路径(文档目录)
log("%s", f->getWritablePath().c_str());
输出得到可以写的路径(mac):
如果是IOS:
ios和mac都是只能写到当前程序的文档目录下
接下来使用文件来进行输入输出:
FILE* f;
freopen(fu->
fullPathFromRelativeFile("data.txt", fu->getWritablePath()).c_str(), "w", stdout);
std::cout << "hello file" << std::endl;
fclose(f);
fullPathFromRelativeFile可以组合当前文件名称和一个路径来创建得到完整路径,运行程序之后可以看到在
/Users/dzzhyk/Documents/路径下产生的文件data.txt
接下来读入文件并且输出:
Data d = fu->getDataFromFile(
fu->fullPathFromRelativeFile("data.txt", fu->getWritablePath()));
log("%s", d.getBytes());
可以正确地得到输出:
4. 读取plist文件
plist文件其实就是xml文件
首先在resource里面添加一个.plist文件,内容大致如下:
接下来在程序中读取plist文件:
// plist文件操作
FileUtils *fu = FileUtils::getInstance();
// 读取map值
ValueMap m = fu->getValueMapFromFile("data.plist");
log("%s", m["name"].asString().c_str());
log("%s", m["id"].asValueMap()["0001"].asString().c_str());
输出结果如下:
成功地读取了plist文件
5. 读取xml文件
首先创建一个xml文件如图,将其添加到资源中:
<data>
<p name="dzzhyk" age="22" />
<p name="dzzhyk1" age="18" />
</data>
cocos2d-x使用了一个库来处理xml:tinyxml2
#include <tinyxml2/tinyxml2.h> // 引入解析头文件的库
要解析xml文件并且读取xml文件内容,需要以下代码:
// 读取xml文件
auto doc = new tinyxml2::XMLDocument();
doc->Parse(FileUtils::getInstance()->getStringFromFile("xml.xml").c_str()); // 解析xml文件
auto root = doc->RootElement(); // 访问到根节点
// 遍历所有节点
for (auto e = root->FirstChildElement(); e != nullptr; e=e->NextSiblingElement()) {
// 遍历所有的属性
std::string s;
for (auto attr = e->FirstAttribute(); attr!=nullptr; attr=attr->Next()) {
s += attr->Name();
s += ":";
s += attr->Value();
s += " ";
}
log("%s", s.c_str());
}
执行程序之后可以看到xml文件被成功地读取出来了:
6. 读取json文件
首先创建一个json文件
[
{"name":"dzzhyk", "age":"20"},
{"name":"dzzhyk1", "age":"28"}
]
cocos2d-x使用json/document.h来处理json文件
#include <json/document.h>
接下来解析并且读取json文件内容:
// 读取json文件
rapidjson::Document d;
// 解析json数据
d.Parse<0>(FileUtils::getInstance()->getStringFromFile("json.json").c_str());
// 访问json内部元素
log("%s", d[(int)0]["name"].GetString()); // 这个地方注意要传递int类型的
执行结果:
7. 随机数
使用CCRANDOM_0_1来生成随机数:
int i = CCRANDOM_0_1()*4; // 生成0-3的随机数