听说Cocos Studio非常久了,主要是由于骨骼动画。眼下看来Cocos2d-x播放动画的方式仅仅有2种:

  第一种:是播放序列帧动画,即将动画的每一帧都载入进缓存里,须要播放时再使用Animation类来播放,这样的方法简单暴力。应对一些细节要求低的动画场景的时候。这么干无伤大雅。

可是当动画帧数稍高的时候就会须要大量的图片,消耗资源非常大。

  另外一种:是由Cocos2d-x提供的Action类来播放动画,这样的动画是在帧循环中靠调整每次渲染的坐标来打到动画效果。因为帧循环是1/60秒刷新一次,会让这样播放的动画很流畅,并且不须要每一帧图片的资源。这样的方案的缺点是播放动画的节点仅仅能载入一张图片资源。当我们要实现一个例如以下的动画时,

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3hxX3d1eGluZ3F1YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

假设单从代码实现须要创建多个精灵,还要绑定各个精灵之间的协调和联动,总之会很很的麻烦。

  骨骼动画能够兼容以上两种方法的长处,同一时候不包括它们的缺点。所以如今越来越多的公司使用Cocos Studio来制作动画。

要使用Cocos Studio 首先要到官网 http://cn.cocos2d-x.org/download 下载你须要的Studio 版本号。因为Cocos2d-x引擎本身的版本号迭代速度比較快,有些版本号的Studio并不能与引擎兼容。这里附上论坛上一个较为具体的版本号相应下载 

tid=154886" style="margin:0px; padding:0px; color:rgb(7,93,179)">http://www.cocoachina.com/bbs/read.php?tid=154886。我使用的是刚公布不久的3.2版引擎。Cocos
Studio 1.5.0.1可以对其兼容。

  初次使用我想完毕两个学习目标:

  第一是学会制作骨骼动画。http://www.cocoachina.com/bbs/read.php?

tid=189665 这个链接里有具体的描写叙述。跟着一步一步来就能够了。我就不做复述了。

(小插曲:我在试用mac版本号刚公布的studio时发现了非常多Bug,建议大家还是在window平台下使用)

  第二是在Cocos2d-xproject中使用Studio制作的动画。

  首先在Cocos2d-x的根文件夹下找到cocos2d-x-3.2\cocos\editor-support文件夹,将cocostudio文件夹以及其包括的文件拷贝到你新建project所在文件夹下。然后用vs打开新建的项目。右击解决方式-》加入-》现有项目,把cocostudio加入进project。

接着右键你的project-》属性-》c\c++-》常规-》附加包括文件夹,把cocostudio的文件夹导入进去。最后接着右键你的project-》属性-》通用属性-》引用-》加入新引用。

  如今我们能够開始写代码了,首先要设计有个Hero类。用他来播放动画,代码例如以下:

 1 #ifndef __HERO_H__
2 #define __HERO_H__
3 #include "cocos2d.h"
4 #include "cocos-ext.h"
5 #include "CocoStudio.h"
6 USING_NS_CC;
7 using namespace cocostudio;
8 USING_NS_CC_EXT;
9 enum DIRECTION { LEFT, RIGHT, NONE };
10 class Hero:public Sprite
11 {
12 public:
13 CREATE_FUNC(Hero);
14 bool init();
15 void runLeft(float dt);
16 void runRight(float dt);
17 void attack();
18 void death();
19 void stop();
20
21 DIRECTION dir;
22 Size size;
23 Armature* armature;
24 bool isAniRunLeft;
25 bool isAniRunRight;
26 };
27 #endif

  我们在Hero的init函数里初始化动画,并调用一个stop函数载入一个站立时的动画:

 1 #include "Hero.h"
2
3 bool Hero::init()
4 {
5 Sprite::init();
6 size = Director::getInstance()->getWinSize();
7 ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Hero0.png", "Hero0.plist", "Hero.ExportJson");
8 armature = Armature::create("Hero");
9 armature->setScale(0.7f);
10 armature->setPosition(Vec2(size.width / 2, size.height / 2));
11 addChild(armature);
12 stop();
13
14 dir = NONE;
15 isAniRunLeft = false;
16 isAniRunRight = false;
17 return true;
18 }
19 void Hero::stop()
20 {
21 armature->getAnimation()->play("loading");
22 }
23 void Hero::runLeft(float dt)
24 {
25 float dis = dt * 200;
26 setPositionX(getPositionX() - dis);
27 }
28 void Hero::runRight(float dt)
29 {
30 float dis = dt * 200;
31 setPositionX(getPositionX() + dis);
32 }
33 void Hero::attack()
34 {
35 armature->getAnimation()->play("attack");
36 }
37 void Hero::death()
38 {
39 armature->getAnimation()->play("death");
40 }

  接着我们须要一个场景类。让我们的Hero在这个场景里面动起来:

 1 #ifndef __HELLOWORLD_SCENE_H__
2 #define __HELLOWORLD_SCENE_H__
3
4 #include "cocos2d.h"
5 #include "cocos-ext.h"
6 #include "CocoStudio.h"
7 #include "Hero.h"
8 USING_NS_CC_EXT;
9 class menuDelegate
10 {
11 public:
12 virtual void stopstate() = 0;
13 };
14 class Panel :public Menu
15 {
16 public:
17 menuDelegate* exm;
18 MenuItem* getSelectItem()
19 {
20 return _selectedItem;
21 }
22 static Panel* create()
23 {
24 Panel* ret = new Panel;
25 ret->init();
26 ret->autorelease();
27 return ret;
28 }
29 bool init()
30 {
31 Menu::init();
32 scheduleUpdate();
33 return true;
34 }
35 void update(float dt)
36 {
37 if (this->getSelectItem() && this->getSelectItem()->isSelected())
38 this->getSelectItem()->activate();
39 else
40 {
41 exm->stopstate();
42 }
43 }
44 };
45 class HelloWorld : public cocos2d::Layer,public menuDelegate
46 {
47 public:
48 // there's no 'id' in cpp, so we recommend returning the class instance pointer
49 static cocos2d::Scene* createScene();
50
51 // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
52 virtual bool init();
53
54 // a selector callback
55 void menuCloseCallback(cocos2d::Ref* pSender);
56
57 // implement the "static create()" method manually
58 CREATE_FUNC(HelloWorld);
59
60 void stopstate();
61 void update(float dt);
62 void moveRight();
63 void moveLeft();
64 void moveAttack();
65 void moveDead();
66 void loadMenu();
67 Hero* hero;
68 Panel* menu;
69 };
70 #endif // __HELLOWORLD_SCENE_H__

  下面是场景类的cpp文件:

  1 #include "HelloWorldScene.h"
2
3 USING_NS_CC;
4 using namespace cocostudio;
5 Scene* HelloWorld::createScene()
6 {
7 // 'scene' is an autorelease object
8 auto scene = Scene::create();
9
10 // 'layer' is an autorelease object
11 auto layer = HelloWorld::create();
12
13 // add layer as a child to scene
14 scene->addChild(layer);
15
16 // return the scene
17 return scene;
18 }
19
20 // on "init" you need to initialize your instance
21 bool HelloWorld::init()
22 {
23 //////////////////////////////
24 // 1. super init first
25 if ( !Layer::init() )
26 {
27 return false;
28 }
29
30 Size visibleSize = Director::getInstance()->getVisibleSize();
31 Vec2 origin = Director::getInstance()->getVisibleOrigin();
32
33 /////////////////////////////
34 // 2. add a menu item with "X" image, which is clicked to quit the program
35 // you may modify it.
36
37 // add a "close" icon to exit the progress. it's an autorelease object
38 auto closeItem = MenuItemImage::create(
39 "CloseNormal.png",
40 "CloseSelected.png",
41 CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
42
43 closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
44 origin.y + closeItem->getContentSize().height/2));
45
46 // create menu, it's an autorelease object
47 auto menu = Menu::create(closeItem, NULL);
48 menu->setPosition(Vec2::ZERO);
49 this->addChild(menu, 1);
50
51 /////////////////////////////
52 // 3. add your codes below...
53
54 // add a label shows "Hello World"
55 // create and initialize a label
56
57 auto label = LabelTTF::create("Hello World", "Arial", 24);
58
59 // position the label on the center of the screen
60 label->setPosition(Vec2(origin.x + visibleSize.width/2,
61 origin.y + visibleSize.height - label->getContentSize().height));
62
63 // add the label as a child to this layer
64 this->addChild(label, 1);
65 loadMenu();
66 hero = Hero::create();
67 addChild(hero);
68 scheduleUpdate();
69 return true;
70 }
71 void HelloWorld::update(float dt)
72 {
73 if (hero->dir == RIGHT)
74 {
75 hero->runRight(dt);
76 }
77 if (hero->dir == LEFT)
78 {
79 hero->runLeft(dt);
80 }
81 }
82 void HelloWorld::loadMenu()
83 {
84 Size size = Director::getInstance()->getWinSize();
85 auto closeItem1 = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_0(HelloWorld::moveLeft, this));
86 auto closeItem2 = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_0(HelloWorld::moveRight, this));
87 auto closeItem3 = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_0(HelloWorld::moveAttack, this));
88 auto closeItem4 = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_0(HelloWorld::moveDead, this));
89 menu = Panel::create();
90 menu->addChild(closeItem1);
91 menu->addChild(closeItem2);
92 menu->addChild(closeItem3);
93 menu->addChild(closeItem4);
94 menu->alignItemsHorizontally();
95 menu->setPositionY(menu->getPositionY() / 2);
96 menu->exm = this;
97 addChild(menu);
98 }
99
100 void HelloWorld::moveRight()
101 {
102 if (hero->dir == NONE)
103 hero->armature->getAnimation()->play("run");
104 float num = hero->armature->getRotationY();
105 if (num == -180)
106 {
107 hero->armature->setRotationY(0);
108 }
109 hero->dir = RIGHT;
110 }
111 void HelloWorld::moveLeft()
112 {
113 if (hero->dir == NONE)
114 hero->armature->getAnimation()->play("run");
115 float num = hero->armature->getRotationY();
116 if (num == 0 )
117 {
118 hero->armature->setRotationY(-180);
119 }
120 hero->dir = LEFT;
121 }
122 void HelloWorld::moveDead()
123 {
124 hero->death();
125 }
126 void HelloWorld::moveAttack()
127 {
128 hero->attack();
129 }
130 void HelloWorld::stopstate()
131 {
132 if (hero->dir == NONE)
133 return;
134 float num = hero->armature->getRotationY();
135 if (num == 0)
136 {
137 hero->stop();
138 CCLOG("111111");
139 }
140 else if (num == -180)
141 {
142 hero->stop();
143 hero->armature->setRotationY(-180);
144 }
145 hero->dir = NONE;
146 }
147 void HelloWorld::menuCloseCallback(Ref* pSender)
148 {
149 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
150 MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
151 return;
152 #endif
153
154 Director::getInstance()->end();
155
156 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
157 exit(0);
158 #endif
159 }

结束!!

。。

本人cocos2dx 2.x和3.x的源代码淘宝地址(欢迎大家光顾):https://shop141567464.taobao.com/?spm=a313o.7775905.1998679131.d0011.pzUIU4

Cocos2d-x 3.1.1 学习日志14--CocosStudio学习必看的更多相关文章

  1. ROS2学习日志:QoS学习日志

    QoS学习日志 参考:ROS2API 及 https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings 1.概述 ...

  2. STM32环境搭建/学习观点/自学方法 入门必看

    文章转自armfly开发板V4软件开发手册,分享学习~ 今天有幸看到armfly的开发板软件开发手册,开头的基础知识,真的很有用,还好有看到,一切都不迟,感悟很多,摘抄部分,学习分享~ 关于开发环境的 ...

  3. TensorFlow实战Google深度学习框架1-4章学习笔记

    目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络   第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...

  4. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

    [转] C#学习笔记14——Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空 ...

  5. Cortex-M3学习日志(六) -- ADC实验

    上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...

  6. Cortex-M3学习日志(五) -- DAC实验

    终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...

  7. MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志

    今天继续Smobiler开发APP的学习日志,这次是做一个title.toolbar.侧边栏三种效果 样式一 一.          Toolbar 1.       目标样式 我们要实现上图中的效果 ...

  8. composer的安装和使用 学习日志

    如果你做为一个phper,没有用过composer,那你真的不是一个合格的开发者.那么就来记录一下composer的学习日志 下面分享几个学习源头: composer中文网站:https://www. ...

  9. GRE学习日志

    发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...

  10. Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法

    Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...

随机推荐

  1. 【从0到1学Web前端】CSS伪类和伪元素

    1.CSS中的伪类 CSS 伪类用于向某些选择器加入特殊的效果. 语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用 select ...

  2. 新闻专栏~ART让Android更流畅

    潘鹏在CSDN上原创,如其它站点转载请注意排版和写明出处: ART.Android新的内存垃圾回收机制 ART的优点:代码加载速度加快----编译次数降低 Android的卡顿是由于内存垃圾回收机制. ...

  3. Iconfinder 如何杜绝盗版,哈希算法检测图像重复

    原地址:http://blog.jobbole.com/65914/ 本文由 伯乐在线 - 小鱼 翻译自 Silviu Tantos.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [伯乐在线导读 ...

  4. Android中怎样在应用A中启动或安装应用B

    看到别人做的游戏攻略,想着自己的游戏攻略也加入新的功能,即Android中怎样在应用A中启动或安装应用B.就查了一些资料整理下来. 启动或安装对应的应用的方法: Step1:推断是否安装目标应用.仅仅 ...

  5. Android网络编程http派/申请服务

    最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...

  6. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  7. U9文件与文件系统的压缩和打包

    1.在Linux的环境中,压缩文件的扩展名大多为:*.tar,*.tar.gz,*.tgz,*.bz2. 2.gzip可以说是应用最广的压缩命令了.目前gzip可以揭开compress,zip和gzi ...

  8. Codeforces 191 C Fools and Roads (树链拆分)

    主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...

  9. jdbc初步(转)

    1. Jdbc的六个编程步骤 1. 注册一个驱动 注册驱动程序有三种方式: 方式一:Class.forName(“oracle.jdbc.driver.OracleDriver”); JAVA 规范中 ...

  10. Android编程获取网络连接状态及调用网络配置界面

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...