cocos2d_x_04_计时器_数据存储

cocos2d_x_04_计时器_数据存储,第1张

概述一、计时器的使用 效果图:点击屏幕,移动头像至指定位置后,停止计时器 类型为SEL_SCHEDULE实质是一个函数指针,指向的是Ref的一个成员方法,参数float,返回值void 场景的.h头文件 场景类的实现.cpp文件 关键代码: //// UpdateScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-5./// 一、计时器的使用 效果图:点击屏幕,移动头像至指定位置后,停止计时器
类型为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@[email protected]");    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_计时器_数据存储所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1001628.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存