cocos2d_x_04_计时器_数据存储

一、计时器的使用
效果图:点击屏幕,移动头像至指定位置后,停止计时器

类型为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("nanaLogo.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/60
void 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;
// 注意 这儿,继承的是 Layer
class 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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是