类型为SEL_SCHEDulE实质是一个函数指针,指向的是Ref的一个成员方法,参数float,返回值voID 场景的.h头文件 场景类的实现.cpp文件 关键代码:
//// UpdateScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-5.////#include "UpdateScene.h"USING_NS_CC;Scene* UpdateScene::createScene(){ // 'scene' 自动释放 // 创建一个scene auto scene = Scene::create(); // 'layer' 自动释放 auto layer = UpdateScene::create(); // 将图层 添加到场景中 scene->addChild(layer); // 返回 填充好图层的 场景 return scene;}// 在 "init" 方法中,实例化自己要用的精灵对象bool UpdateScene::init(){ // 1. 调用父类的init,cpp 没有super,直接写父类名 if ( !Layer::init() ) return false; // 屏幕尺寸 winSize = Director::getInstance()->getVisibleSize(); // 添加 一个精灵,点击屏幕后,精灵在update方法中 更改位置 addSprite(); // 添加一个LabelTTF,点击文字后,在updateposition方法中 更改位置 addLabelTTF(); return true;}#pragma mark - 初始化// 添加一个精灵,精灵在update方法中 更改位置voID UpdateScene::addSprite(){ // 精灵精灵Nana nana = Sprite::create("nana@R_419_6192@.png"); nana->setAnchorPoint(Point(0,0)); nana->setposition(Point(0,0)); this->addChild(nana); // 2.触摸屏幕,开启 时钟update // 实例化一个触摸监听器 对象 auto Listener = EventListenertouchOneByOne::create(); // 当触摸开始时,绑定一个闭包函数; // 【】表示 要传入的外界对象,此处是this // ()表示参数 Listener->ontouchBegan = [this](touch *t,Event *e){ // 开启默认的 时钟方法 scheduleUpdate(); return false; }; // 5、获取事件分发器,添加一个事件监听器,到this身上;即监听的是this对象【整个图层Layer】 Director::getInstance()->getEventdispatcher()->addEventListenerWithSceneGraPHPriority(Listener,this); }// 添加一个LabelTTF,在updateposition方法中 更改位置voID UpdateScene::addLabelTTF(){ // Label label = LabelTTF::create("Nana","CourIEr",90); label->setAnchorPoint(Point(0,0)); label->setposition(Point(0,0)); label->setname("label"); addChild(label); // 2.触摸Label,开启 时钟updateposition // 实例化一个触摸监听器 对象 auto Listener = EventListenertouchOneByOne::create(); // 当触摸开始时,Event *e){ // 如果 点击 了label,才每隔一秒执行一次 更新位置方法 LabelTTF *label =(LabelTTF *) e->getCurrentTarget()->getChildByname("label"); if (label->getBoundingBox().containsPoint(t->getLocation())) { // 开启指定时间的 时钟方法;参数是:函数指针,返回值是voID,参数是float,指向的是Ref内的一个方法 schedule(schedule_selector(UpdateScene::updateposition),1); } return false; }; // 5、获取事件分发器,this); }#pragma mark - 时钟方法// 时钟方法,使用的是默认的帧率 1/60voID UpdateScene::update(float dt){ // 向右上角,移动nana,当位置大于 400时,stop nana->setposition(nana->getposition()+Point(3,3)); if (nana->getposition().x>400) { // 停止时钟方法 unscheduleUpdate(); } }// 时钟方法,使用的是 1秒1次voID UpdateScene::updateposition(float dt){ // 向右上角,stop label->setposition(label->getposition()+Point(50,50)); if (label->getposition().x>300) { // 停止所有时钟方法 unscheduleAllSelectors(); } }
二、用户偏好UserDefault 三、fileUtils文件 *** 作工具类 它屏蔽了不同的平台mac ios androID等 fileUtils文件写出和读入演示 如果是Mac平台,则可用目录就是:【/Users/beyond/documents/】 如果是iOS平台,则可用目录就是:【.../app/documents/】
四、PList文件读取
使用的依然是fileUtils工具类 返回的类型是: 字典【ValueMap】或数组【ValueVector】 五、XML文件读取
cocos2d中解析XML用到的库
#include <tinyxml2/tinyxml2.h>
六、JsON文件读取cocos2d内置的解析Json的库
#include <Json/rAPIdJson.h>
#include <Json/document.h>
标记parseFlags默认为0即可 输出结果: 七、场景的代码实现//// fileScene.h// 01_cocos2d-x//// Created by beyond on 14-10-5.////#ifndef ___1_cocos2d_x__fileScene__#define ___1_cocos2d_x__fileScene__#include "cocos2d.h"USING_NS_CC;// 注意 这儿,继承的是 Layerclass fileScene : public cocos2d::Layer{private: // 屏幕尺寸 Size winSize; Sprite *nana; LabelTTF *label;public: // c++里面没有ID类型,所以 返回类的实例对象的 指针 static cocos2d::Scene* createScene(); // 以下是 不同点:cocos2d-x的 'init' 方法 返回 bool // 而cocos2d-iphone 返回 'ID' 类型 virtual bool init(); // 宏 自动实现 "静态的 create()方法" CREATE_FUNC(fileScene); // file *** 作 // 用户偏好 voID userDefault(); // 文件读写 fileUtils工具类,屏蔽了不同的 *** 作系统 mac ios androID等 voID fileUtils(); // PList 返回只可能是 字典【ValueMap】 或 数组【ValueVector】 voID readPList(); // 解析XML voID readxml(); // 解析JsON voID readJsON(); };#endif /* defined(___1_cocos2d_x__fileScene__) */
//// fileScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-5.////#include "fileScene.h"// 导入 xml 解析器#include <tinyxml2/tinyxml2.h>// 导入 Json 解析器#include <Json/rAPIdJson.h>#include <Json/document.h>USING_NS_CC;Scene* fileScene::createScene(){ // 'scene' 自动释放 // 创建一个scene auto scene = Scene::create(); // 'layer' 自动释放 auto layer = fileScene::create(); // 将图层 添加到场景中 scene->addChild(layer); // 返回 填充好图层的 场景 return scene;}// 在 "init" 方法中,实例化自己要用的精灵对象bool fileScene::init(){ // 1. 调用父类的init,直接写父类名 if ( !Layer::init() ) return false; // 屏幕尺寸 winSize = Director::getInstance()->getVisibleSize(); // 2.文件 *** 作演示 this->userDefault(); this->fileUtils(); this->readPList(); this->readxml(); this->readJsON(); return true;}#pragma mark - 文件 *** 作// 用户偏好voID fileScene::userDefault(){ // 存 UserDefault::getInstance()->setStringForKey("Bookname","红楼梦"); // 读 参数2 表示:如果key不对,或者取不到 值时,默认值 log("%s",UserDefault::getInstance()->getStringForKey("Bookname","名著").c_str()); // cocos2d: 红楼梦}// 文件读写 fileUtils工具类,屏蔽了不同的 *** 作系统 mac ios androID等voID fileScene::fileUtils(){ //********************写入文件*********************** // 1.屏蔽不同平台的 文件工具类【单例】 auto util = fileUtils::getInstance(); // 获得可以写的路径,返回值是std::string类型 std::string wPath = util->getWritablePath(); log("wPath %s",wPath.c_str()); // cocos2d: wPath /Users/beyond/library/Application Support/iPhone Simulator/7.1/Applications/FC92FA39-E149-4C04-AC55-2FB0930E208B/documents/ // 文件名+相对路径 = 文件的绝对路径 std::string fullPath = util->fullPathFromrelativefile("1.txt",wPath); log("fullPath %s",fullPath.c_str()); // cocos2d: fullPath /Users/beyond/library/Application Support/iPhone Simulator/7.1/Applications/FC92FA39-E149-4C04-AC55-2FB0930E208B/documents/1.txt // C 文件 *** 作函数 参数1:文件绝对路径(C字串),参数2: *** 作mode file *file = fopen(fullPath.c_str(),"w"); // 2.写入 内容 fprintf(file,"演示Demo:如何 通过 工具类fileUtils向不同平台 写入 Hello Beyond~\n"); // 3.关闭file fclose(file); //*********************读取内容********************** Data d = util->getDataFromfile(fullPath); // 输出到控制台 log("%s",d.getBytes()); // cocos2d: 演示Demo:如何 通过 工具类fileUtils向不同平台 写入 Hello Beyond~}// PList 返回只可能是 字典【ValueMap】 或 数组【ValueVector】voID fileScene::readPList(){ // 1.屏蔽不同平台的 文件工具类【单例】 fileUtils *util = fileUtils::getInstance(); // 2.根 是字典 ValueMap dict = util->getValueMapFromfile("data.pList"); // 因为ValueMap重载了运算符【】 log("%s",dict["name"].asstring().c_str()); // cocos2d: 红楼梦 std::string s = dict.at("author").asstring(); log("%s",s.c_str()); // cocos2d: 曹雪芹 }// 解析XML// 导入 xml 解析器// #include <tinyxml2/tinyxml2.h>voID fileScene::readxml(){ // document对象 tinyxml2::XMLdocument *doc = new tinyxml2::XMLdocument(); // 1.屏蔽不同平台的 文件工具类【单例】 fileUtils *util = fileUtils::getInstance(); std::string content = util->getStringFromfile("data.xml"); log("%s",content.c_str()); // 2.开始解析 doc->Parse(content.c_str()); // 解析完成后,从doc中取得根节点 tinyxml2::XMLElement *root = doc->RootElement(); // 从根节点的【FirstChildElement】开始,遍历所有的XMLElement,直至节点为空 for (tinyxml2::XMLElement *e = root->FirstChildElement(); e != NulL; e=e->NextSiblingElement()) { // 用于拼接 std::string str; // 第2层遍历,遍历节点的 所有 Attribute for (auto attr = e->FirstAttribute(); attr != NulL; attr=attr->Next()) { // 属性名称 str+=attr->name(); str+=":"; // 属性值 str+=attr->Value(); str+=","; } // 输出到控制台 log("%s",str.c_str()); }}// 解析Json// #include <Json/rAPIdJson.h>// #include <Json/document.h>voID fileScene::readJsON(){ // document对象 rAPIdJson::document doc; // 1.屏蔽不同平台的 文件工具类【单例】 fileUtils *util = fileUtils::getInstance(); std::string content = util->getStringFromfile("data.Json"); log("%s",content.c_str()); // 从一段只读的string 开始解析 doc.Parse<0>(content.c_str()); // 解析完成,打印输出 int i = 0; log("%s",doc[i]["name"].GetString()); log("%s",doc[i]["author"].GetString()); log("%s",doc[(int)1]["name"].GetString()); log("%s",doc[(int)1]["author"].GetString());}
八、通过Flash CC导出的PList文件和大图片, 创建帧动画 首先,下载Flash_Professional_13_LS20.dmg,约1G左右 按下面方法,运行补丁
打开Flash,打开【库library】,点击左下角的新建按钮, 新建一个Symbol,类型选择【影片剪辑MovIE Clip】; 在第1帧先画一个正方形,按F6在第20帧创建一个关键帧; 并在第20帧 删除原来的正方形,画一个圆形; 在上面两个关键帧之间的任意一帧,右击,创建一个【形变补间动画shape tween】 最后,重点,导出为cocos2d用的大纹理+PList文件 点击库,右击刚才创建的影片剪辑【movIE clip】,选择【Generate Sprite Sheet】,data format选择【cocos2D v3】,选择【Export导出】 这时,生成了pList文件+一个大纹理图片,如下所示
pList文件 精灵帧缓存、纹理缓存、SpriteBatchNode三者的关系
九、通过Flash CC导出的 Json 文件和大图片, 创建帧动画 大图片纹理 如下图所示: 导出的Json数据如下所示:
{"frames": {"hero0000":{ "frame": {"x":0,"y":0,"w":44,"h":52},"rotated": false,"trimmed": false,"SpritesourceSize": {"x":0,"sourceSize": {"w":44,"h":52}},"hero0004":{ "frame": {"x":42,"y":52,"w":42,"trimmed": true,"SpritesourceSize": {"x":2,"h":52}}},"Meta": { "app": "Adobe Flash Professional","version": "13.1.0.226","image": "Hero.png","format": "RGBA8888","size": {"w":128,"h":128},"scale": "1"}}
下面通过cocos2d内置的rAPIdJson解析,并封装成一个Animate对象(可直接runAction)
//// FlashTool.cpp// 01_cocos2d-x//// Created by beyond on 14-10-6.////#include "FlashTool.h"// Json解析 使用cocos2d 内置的rAPIdJson库#include <Json/document.h>// 通过解析flash cc 导出的Json文件+大图片,生成一个Animate对象,用于执行序列帧动画Animate * FlashTool::animateFromJsonfile(std::string Jsonfile,float delayPerUnit){ // 文档 对象 rAPIdJson::document doc; // fileUtils工具类 读入Json文件 std::string fileContent = fileUtils::getInstance()->getStringFromfile(Jsonfile); // fileContent.erase(0,fileContent.find_first_of('{')); // 标记默认为 0,开始解析 doc.Parse<0>(fileContent.c_str()); // 得到大图片的 图片名 std::string imgfilename = doc["Meta"]["image"].GetString(); auto &frames = doc["frames"]; // 精灵帧缓存 auto sfc = SpriteFrameCache::getInstance(); // 容器用于 存放所有的 动画帧 Vector<AnimationFrame*> animFrames; // 遍历,裁剪,创建,添加到容器 for (auto m=frames.MemberonBegin(); m!=frames.MemberonEnd(); m++) { auto framename = m->name.GetString(); auto & framePropertIEs = m->value["frame"]; auto & SpritesourceSize = m->value["SpritesourceSize"]; auto sf = sfc->getSpriteFrameByname(framename); if (!sf) { sf = SpriteFrame::create(imgfilename,Rect(framePropertIEs["x"].GetInt(),framePropertIEs["y"].GetInt(),framePropertIEs["w"].GetInt(),framePropertIEs["h"].GetInt()),m->value["rotated"].GetBool(),Vec2(SpritesourceSize["x"].GetInt(),SpritesourceSize["y"].GetInt()),Size(SpritesourceSize["w"].GetInt(),SpritesourceSize["h"].GetInt())); sfc->addSpriteFrame(sf,framename); } animFrames.pushBack(AnimationFrame::create(sf,delayPerUnit,ValueMapNull)); } // 生成用于Action的Animate Animation * animation = Animation::create(animFrames,delayPerUnit); return Animate::create(animation);}总结
以上是内存溢出为你收集整理的cocos2d_x_04_计时器_数据存储全部内容,希望文章能够帮你解决cocos2d_x_04_计时器_数据存储所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)