CocoStudio sample讲解 SampleUIAnimation UI动画

CocoStuido sample----SampleUIAnimation源代码地址
https://github.com/chukong/CocoStudioSamples
大家可以预先下载这个源代码, 等下要用到里面的图片资源哦
一 目标

在本教程里, 我们学习下UI动画的制作, 点击下按钮会执行UI动画.
我们使用的cocos2d-x的版本是2.2.2, CocoStudio的版本是1.2.0.1. 不同的版本, 功能上会有差异, 大家学习时, 最好采用对应的版本.
二 创建项目并导入资源
大家可以在下载到的源代码的SampleUIAnimation\SampleUIAnimation_editor\Resources 目录下找到我们需要的资源.
我们首先打开UI编辑器, 并创建一个新的项目.
然后大家可以在资源面板点击导入文件按钮, 导入这些资源文件, 导入后的资源面板如下.

三 构建界面
我们在UI编辑器的普通模式下, 分别拖入一个按钮控件和图片控件.
选中按钮控件, 并从菜单 “视图”=>“属性"中打开属性面板, 我们修改下按钮控件的各项属性.
勾选交互, 名字命名为"TextButton”, 文本修改为"start anim", 我们还需要为按钮设置点击时的图片.
将正常状态, 禁用状态设置为"backtotopnormal.png", 按下状态设置为"backtotoppressed.png". 设置的方法, 可以把图片从资源面板拖入对应框即可.
如下图所示.

同样, 我们设置下图片控件各属性. 名字为"ImageView", 文件为"CocoStudio_UIEditor.png"即可.
我们还可以在渲染区拖动下按钮, 图片控件到合适的位置.
四 制作动画
好, 现在让我们开始制作动画吧.
在动作列表面板点击右键, 选择"添加动画", 我们得到了"Animation0"的动画. 双击该动画名, 可以重命名. 我们这里将其重命名为"Animation1".

接下来我们为动画添加第一个关键帧.
在渲染区选中图片控件, 在控件上点击右键, 选择编辑动画(快捷键Ctrl+M). 这时ImageView就被加入到了关键帧的对象列表中.
选中ImageView, 然后点击添加关键帧面板中的添加关键帧按钮, 我们就为ImageView添加了第一个关键帧.

这时我们可以拖过在渲染区选中ImageView, 可以拖动, 缩放, 旋转来给这一帧的ImageView设置状态, 也可以打开属性面板, 来调节其他属性.
然后我们可以拖动下黄色的时间轴游标到新的位置, 然后继续添加新的关键帧, 并设置新的属性.
添加了几个关键帧之后, 点击关键帧面板的播放按钮, 图片控件已经动了起来了! 太棒了!
五 导出资源
用快捷键Ctrl+E打开导出对话框, 选择导出的路径, 按默认配置导出. 我们稍后会用到这些文件.
六 在cocos2d-x工程中添加导出后的资源
想必各位看官都已经熟练掌握了cocos2d-x工程的创建, 我这里就不再啰嗦了.
创建完工程之后, 需要将我们上面用CocoStudio导出的几个文件拷贝到cocos2d-x工程的Resources文件夹下.
七 代码实现
我们在工程中添加一个CocosGUIExamplesUIAnimationScene的类, 我们先来看下CocosGUIExamplesUIAnimationScene.h类的声明部分.

//添加头文件#include “cocos2d.h”#include “cocos-ext.h”
//使用命名空间USING_NS_CC;USING_NS_CC_EXT;using namespace gui;
//从CCScene派生class CocosGUIExamplesUIAnimationScene : public CCScene{public: virtual void onEnter(); virtual void onExit(); protected: void menuCloseCallback( CCObject* pSender, TouchEventType type);//响应关闭按钮回调 void UIAnimationInit(); //初始化 void startUIAnimation( CCObject* pSender, TouchEventType type);// protected: UILayer* m_pUILayer; //layer对象};
我们再来看下CocosGUIExamplesUIAnimationScene.cpp, 类的实现部分.

#include “CocosGUIExamplesUIAnimationScene.h”
void CocosGUIExamplesUIAnimationScene ::onEnter(){ CCScene::onEnter(); m_pUILayer = UILayer::create(); m_pUILayer->scheduleUpdate(); addChild(m_pUILayer); //初始化 UIAnimationInit(); //添加退出按钮 UIButton* exit_button = UIButton::create(); exit_button->setTouchEnabled( true); exit_button->loadTextures( “CloseNormal.png”, “CloseSelected.png” , “” ); exit_button->setPosition( ccp(m_pUILayer->getContentSize().width - exit_button->getContentSize().width, exit_button->getContentSize().height)); exit_button->addTouchEventListener( this, toucheventselector(CocosGUIExamplesUIAnimationScene ::menuCloseCallback)); //添加关闭按钮点击事件 m_pUILayer->addWidget(exit_button);}
//退出时清理资源void CocosGUIExamplesUIAnimationScene ::onExit(){ m_pUILayer->removeFromParent(); SceneReader::sharedSceneReader()->purge(); GUIReader::shareReader()->purge(); cocos2d::extension:: ActionManager::shareManager()->purge(); CCScene::onExit();}
//响应关闭按钮点击事件void CocosGUIExamplesUIAnimationScene ::menuCloseCallback(CCObject* pSender, TouchEventType type ){ if (type == TOUCH_EVENT_ENDED) { CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS ) exit(0);#endif }}
void CocosGUIExamplesUIAnimationScene ::UIAnimationInit(){ //加载编辑器导出的资源 Layout* uianimation_root = dynamic_cast<Layout >(GUIReader ::shareReader()->widgetFromJsonFile(“cocosgui/gui_examples/SampleUIAnimation/SampleUIAnimation.json”)); m_pUILayer->addWidget(uianimation_root); //获取点击按钮 UIButton button = static_cast<UIButton >(m_pUILayer->getWidgetByName(“TextButton”)); //设置按钮点击事件响应 button->addTouchEventListener( this, toucheventselector(CocosGUIExamplesUIAnimationScene ::startUIAnimation));}
void CocosGUIExamplesUIAnimationScene ::startUIAnimation(CCObject
pSender, TouchEventType type ){ if (type == TOUCH_EVENT_ENDED) //当点击结束时 { //播放动画Animation1 cocos2d::extension:: ActionManager::shareManager()->playActionByName(“SampleUIAnimation.json” , “Animation1” ); }}
然后我们在AppDelegate.cpp中, 添加引用.

#include “CocosGUIExamplesUIAnimationScene.h”

修改AppDelegate::applicationDidFinishLaunching函数, 使用CocosGUIExamplesUIAnimationScene启动.

CocosGUIExamplesUIAnimationScene *pScene = new CocosGUIExamplesUIAnimationScene ();    pScene->autorelease();    pDirector->runWithScene(pScene);

好啦, 快运行下吧!

啦啦啦啦啦, 新的一篇新鲜出炉啦, 希望大家能喜欢.

欢迎交(tu)流(cao)啊.

你好,帧动画和UI动画的区别是什么?两种动画在什么地方用?

你好.

UI动画是用帧动画来实现的.

麻烦你看下
http://www.cocoachina.com/bbs/read.php?tid=189060
这个帖子的 “五 构建动画” 一节. 里面对帧动画, 有着较详细的叙述

如果还有问题, 欢迎来继续交流哈.

您好,请问我新建的class 必须得继承 CCScene 吗? 不能 像其他类一样继承CCLayer 吗?
还有如果必须继承CCScene ,那以后但凡是包含UI 的class 就得继承CCScene 而不继承CCLayer 了?

— Begin quote from ____

引用第4楼ontheroad于2014-03-13 17:15发表的 回 1楼(young40) 的帖子 :
您好,请问我新建的class 必须得继承 CCScene 吗? 不能 像其他类一样继承CCLayer 吗?
还有如果必须继承CCScene ,那以后但凡是包含UI 的class 就得继承CCScene 而不继承CCLayer 了? http://www.cocoachina.com/bbs/job.php?action=topost&tid=192723&pid=902743

— End quote

您好, 首先使用UI动画的时候和类是从什么地方派生没有关系. 这个要明确.

至于是从CCScene继承还是从CClayer继承, 取决于您的类的设计.
比如, 我们这个类CocosGUIExamplesUIAnimationScene 是为了替代HelloWorld的那个默认类.

由于2d-x要求必须有一个运行的scene, 如果你的类是从Layer或者其他类继承, 将其加入当前运行的scene也是可以的.

额, 感觉有点绕哈, 希望说明白了.

不好意思,还是不太明白,不知道能留个QQ号或者其他联系方式? 我还有几个关于cocostudio的问题需要请教你

我的类是继续自 CCLayer ,然后把你上面的那个UILayer 加载到那个类中去,程序是报错的。貌似是CClayer 不能再加载UILayer了

— Begin quote from ____

引用第7楼ontheroad于2014-03-13 18:12发表的 回 5楼(young40) 的帖子 :
我的类是继续自 CCLayer ,然后把你上面的那个UILayer 加载到那个类中去,程序是报错的。貌似是CClayer 不能再加载UILayer了
http://www.cocoachina.com/bbs/job.php?action=topost&tid=192723&pid=902798

— End quote

你可以打开SampleChangeEquip这个工程, 可以在AppDelegate.cpp中看到
CCScene *pScene = HelloWorld::scene();

// run
pDirector->runWithScene(pScene);

默认是从HelloScene启动的游戏.

HelloScene.cpp中, HelloWorld::init函数里面
Bag* bag = Bag::create();
this->addChild(bag);

而Bag类就是从CCLayer继承的, 而非Scene.

我们这篇帖子提到的工程SampleUIAnimation的AppDelegate.cpp中
CocosGUIExamplesUIAnimationScene *pScene = new CocosGUIExamplesUIAnimationScene();
pScene->autorelease();

// run
pDirector->runWithScene(pScene);

是从CocosGUIExamplesUIAnimationScene类启动的游戏.
而CocosGUIExamplesUIAnimationScene 就是从Scene继承的.

希望这样对比能说明白.

PS: 在描述问题的时候, 希望能详细地描述下你遇到的问题, 尽可能地提供能想到的信息, 这样也有利于别人能帮助你尽快找到问题的所在.
否则, 可能就出现信息不对称, 因为操作系统, 环境, 版本, 等等各种因素都有可能导致问题. 基本靠猜的话, 别人是手足无措的.

昨天子龙山人发了个微博, 提到怎么问问题, 你可以看下, 权当一乐.
http://www.weibo.com/1703959697/AAOSqeCh2

彻底明白了! 非常感谢!
辛苦了!

ok, 欢迎常来交流.

ui动画里能不能挂载动画编辑生成的动画 粒子等

可以的.
挂载例子的例子可以看

CocoStudio sample讲解SampleParticle 粒子的使用
http://www.cocoachina.com/bbs/read.php?tid=192066

动画的道理和这个类似.

mark,非常给力

楼主 我表示你这代码发表时候能能注明版本 还有就是我这根本就编译不过啊 都没有介个shareManager()接口

一 目标
下面注明的很清楚哈.

我们使用的cocos2d-x的版本是2.2.2, CocoStudio的版本是1.2.0.1. 不同的版本, 功能上会有差异, 大家学习时, 最好采用对应的版本.

按照LZ的做了,可是这样:

按照LZ的做了,可是为什么动画找不到呢?

这是一些截图,求LZ告知,为什么不行…坐等

3.0 lua 里怎么使用 ?
http://www.cocoachina.com/bbs/read.php?tid=198638