CocoStudio基础教程(3)在程序中处理cocoStudio导出动画
1、概述
使用cocoStudio可以方便的制作动画,接下来的工作就是在我们的程序中使用制作的动画。这篇中,我将使用程序将两个动画连接起来
2、关联到项目
运行脚本创建我们的项目,将导出的动画、UI放到Resource文件夹中,然后重写init方法。
bool HelloWorld::init() { // // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); auto ui = dynamic_cast<Layout*>(CCUIHELPER->createWidgetFromJsonFile("ControlUI.ExportJson")); ui->getChildByTag(UI_BUTTON_PLAY1)->addTouchEventListener(this, toucheventselector(HelloWorld::touchCallBack)); ui->getChildByTag(UI_BUTTON_PLAY2)->addTouchEventListener(this, toucheventselector(HelloWorld::touchCallBack)); ui->getChildByTag(UI_BUTTON_CONN)->addTouchEventListener(this, toucheventselector(HelloWorld::touchCallBack)); ui->getChildByTag(UI_BUTTON_DISCONN)->addTouchEventListener(this, toucheventselector(HelloWorld::touchCallBack)); auto uiLayer = UILayer::create(); uiLayer->addWidget(ui); this->addChild(uiLayer); return true; } void HelloWorld::touchCallBack(Object* obj,TouchEventType type) { //will play }
3、加载动画
动画的导出文件也是一个json。载入后被封装到一个Armature对象中。Armature是NodeRGBA的子类,所以它可以直接被addChild到父节点中。加载所用的是ArmatureManager中的方法。它是一个单例,管理整个场景中的Armature。我们在编辑器中编辑的动画是Animation,它被封装在Armature中了。因此这是一个三层的结构。ArmatureManager最大,然后是Armature,最后是Animation。我们播放动画用的都是Animation中的方法。
说完了原理,我们来看看代码。首先在init中添加加载Armature。
ArmatureDataManager::getInstance()->addArmatureFileInfo("MyAnimation.ExportJson"); Armature* armature = Armature::create("MyAnimation"); armature->setTag(AM_MYANIMATION); armature->setPosition(Point(origin.x + visibleSize.width/2 , origin.y + visibleSize.height/2)); this->addChild(armature);
然后重写touchCallback方法控制播放动画。
void HelloWorld::touchCallBack(Object* obj,TouchEventType type) { auto uiBt = dynamic_cast<UIButton*>(obj); if(!uiBt) { return; } int tag = uiBt->getTag(); auto armature = (Armature*)getChildByTag(AM_MYANIMATION); switch (type) { case TouchEventType::TOUCH_EVENT_ENDED: if(tag == UI_BUTTON_PLAY1) { armature->getAnimation()->play("hit"); } else if(tag ==UI_BUTTON_PLAY2) { armature->getAnimation()->play("fall"); } else if(tag == UI_BUTTON_CONN) { armature->getAnimation()->setMovementEventCallFunc(this,movementEvent_selector(HelloWorld::movementCallback)); } else if(tag == UI_BUTTON_DISCONN) { armature->getAnimation()->setMovementEventCallFunc(this,nullptr); } break; default: break; } }
4、处理动画事件
在Animation中有动画事件的概念,每一个动画开始和结束都会事件。我们需要做的就是监听这个事件并为其写好响应函数。
所以接下来我们完善touchCallback函数,并添加一个监听函数
void HelloWorld::movementCallback(Armature * armature, MovementEventType type, const char * name) { if (type == COMPLETE) { if (strcmp(name,"fall") == 0) { Armature* arm = (Armature*) getChildByTag(AM_MYANIMATION); arm->getAnimation()->play("hit"); } } }
5、总结
通过ArmatureDataManager单例来加载动画,将其关联到程序中。动画事件的监听,对动画的行为进行处理。使用这些方法我们可以灵活的使用cocoStudio创建的动画了。
转载于:https://www.cnblogs.com/damowang/p/4835841.html
CocoStudio基础教程(3)在程序中处理cocoStudio导出动画相关推荐
- R语言基础教程6:程序设计基础
R语言基础教程1:数据类型 R语言基础教程2:散点图 R语言基础教程3:曲线图.误差线和图例 R语言基础教程4:柱形图 R语言基础教程5:图形页面排版 R语言基础教程6:程序设计基础 R语言基础教程7 ...
- #python基础教程太阳黑子图形程序的第一个原型
#!/usr/bin/env python # -*- coding: utf-8 -*- #python基础教程太阳黑子图形程序的第一个原型(sunspots_roto.py) from repo ...
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos
上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo.下面通过这篇,详细介绍当使用Nacos作为配置中心之后,如何实现Sentinel Dashbo ...
- ArcGIS二次开发基础教程(03):保存文档和导出地图
ArcGIS二次开发基础教程(03):保存文档和导出地图 保存文档 保存: //这里的path为全局变量 在打开文件获添加数据时赋值原路径 //判断打开文件是否为mxd文件 是则保存 不是则另存为 i ...
- OPhone Camera教程 -- 如何在程序中使用照相机
在本教程中将介绍如何在程序中使用OPhone手机的摄像头来拍照,有些程序是需要使用手机摄像头作为输入设备的,例如二维码识别软件. OPhone Camera 介绍 在OPhone手机中通过androi ...
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo
在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...
- 【新】Notion基础教程(持续更新中……)
目录 0 开始用Notion的原因 1 基础介绍 2 基本功能 2.0 命令字符呼出 2.1 标题设置 2.2 文本格式 2.3 序号 2.4 文本输入 2.5 引用 3 数学公式 4 其他快捷键 0 ...
- C++基础教程(黑马程序员讲义)
文章目录 C++基础入门 1 C++初识 1.1 第一个C++程序 1.1.1 创建项目 1.1.2 创建文件 1.1.3 编写代码 1.1.4 运行程序 1.2 注释 1.3 变量 1.4 常量 1 ...
- Python基础教程:获取list中指定元素的索引
在平时开发过程中,经常遇到需要在数据中获取特定的元素的信息,如到达目的地最近的车站,橱窗里面最贵的物品等等.怎么办?看下面 方法一: 利用数组自身的特性 list.index(target), 其中a ...
最新文章
- PHP中单例模式:三私一公是什么?
- leangoo领歌敏捷工具工作台可查看最近访问脑图和项目
- hive mysql 远程_ubuntu中为hive配置远程MYSQL database
- [ActionScript 3.0] AS3.0 下雨及涟漪效果
- iOS设计模式-生成器
- layuiadmin上手好难_孩子学什么乐器好?十种最受欢迎乐器的优劣势分析
- 手机开启热点给其他设备上网和用插卡随身路由给其他设备上网有何区别呢?
- 如何选择普通索引和唯一索引?|CSDN博文精选
- Java将excel文件转成json文件(有错误)
- win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结
- Hive_Hive的数据模型_分区表
- php异步通知并查询,服务器异步通知的接收by php
- mysql redolog日志
- iOS:懒加载符号绑定流程
- RTP/RTCP/RTSP/SIP/SDP 关系
- 招聘工作总结(精选多篇)
- 手机通话记录重复显示怎么处理_华为出现重复联系人 - 卡饭网
- 多个无线WIFI路由器之间实现不掉线无缝切换的设置方法
- F5 HSL高速日志配置(GTMLTM)
- 组织结构图 js实现
热门文章
- python科学计算主要学什么_以下哪些是python常用的科学计算库?_学小易找答案
- 小船过河(贪心算法)
- 空洞卷积(Dilated Convolutions)
- pg高可用之repmgr(一)
- Karaf-cellar 集群配置
- maven更换阿里云仓库
- 深度学习模型DNN部署到安卓设备上全流程示例——{pytorch->onnx>ncnn->Android studio}
- CAS4.0配置Mysql数据库,认证失败
- Java:面向Web和移动应用的Java开发的增长
- 优秀的产品经理需要具备哪些能力?