cocos2d-x基础 - 常用功能

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的随机数
原创文章 187 获赞 29 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43826242/article/details/104133561