1、概述

帧事件也是新加入的功能。这篇中我们将看到如何使用它。我们将上篇中制作的动画稍加修改。有图为证:

2、用途与原理

首先介绍一下帧事件。正如其名:一个与帧相关联的事件。

为什么要这么做呢?首先没人想做一大堆碎动画,然后一点一点拼着播放吧。另外,有时候流程与事件控制最好关联到帧。比如一个攻击动作,有出刀和收刀两部 分。伤害自然是在刀所触到敌人时候产生的。做成两个动画比较麻烦,程序要管理大量的动画,而且美工也会很郁闷:不但给你们切图,还要给你们切动画。如果用 固定时间来做,也是会有问题。比如机器卡了,帧数就会下降。这个时候,时间就不准确了。用帧事件的方式就会比较好,到了“触刀”那帧,就会有事件,能较好 的处理这种情况。

它的原理是监听。当运行到事件所在的帧时,会触发回调。我们要做的就是在回调函数中操作,判断这一帧是不是我们想要的,标记的方式是Tag字符串。

3、设置帧事件

打开项目,运行动画编辑器,切换到动画模式。

将时间轴拖动到相应帧处,选择一个对象,这里我选择的是左手。然后在它的属性中设置帧事件。

4、创建新工程

运行脚本创建testFrameEvt,编译运行确保原始工程正确。

将CocoStudio导出的资源复制到Resource目录下。

然后配置CocoStudio导出文件的依赖路径和库。可参照:Cocos2d-x 3.0 开发(十一)3.0 alpha1文件结构变化 。

5、载入动画

更改init:

[cpp] view plaincopyprint?
  1. bool HelloWorld::init()
  2. {
  3. //
  4. // 1. super init first
  5. if ( !Layer::init() )
  6. {
  7. return false;
  8. }
  9. Size visibleSize = Director::getInstance()->getVisibleSize();
  10. Point origin = Director::getInstance()->getVisibleOrigin();
  11. ArmatureDataManager::getInstance()->addArmatureFileInfo("changeShape.ExportJson");
  12. Armature* arm =Armature::create("changeShape");
  13. arm->getAnimation()->play("frameSingle");
  14. arm->getAnimation()->setSpeedScale(0.5);
  15. arm->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
  16. this->addChild(arm);
  17. return true;
  18. }

运行,可见动画播放。

6、监听帧事件

 

在类中添加一个函数:

[cpp] view plaincopyprint?
  1. void onFrameEvent(Bone *bone, const string& evt, int originFrameIndex, int currentFrameIndex);

并在cpp中实现:

[cpp] view plaincopyprint?
  1. void HelloWorld::onFrameEvent(Bone *bone, const string& evt, int originFrameIndex, int currentFrameIndex)
  2. {
  3. if(strcmp(evt,"110") == 0)
  4. {
  5. ActionInterval *action =  ShatteredTiles3D::create(0.8f, Size(30,30), 5, false);
  6. this->runAction(action);
  7. }
  8. }

可以看出,事件是由一个字符串来标记的。

最后在init中注册:

[cpp] view plaincopyprint?
  1. arm->getAnimation()->setFrameEventCallFunc(this,frameEvent_selector(HelloWorld::onFrameEvent));

帧事件我们用了一个效果来表现,所以还要恢复Grid,这里我们加入一个schedule函数。当然,这里也可以用帧事件来标记恢复点。

[cpp] view plaincopyprint?
  1. //声明
  2. void checkAction(float dt);
  3. //实现
  4. void HelloWorld::checkAction(float dt)
  5. {
  6. if ( this->getNumberOfRunningActions() == 0 && this->getGrid() != nullptr)
  7. this->setGrid(nullptr);
  8. }
  9. //注册
  10. schedule( schedule_selector(HelloWorld::checkAction) );

编译运行,就能看到效果了。

7、总结

通过在cocoStudio中设置Tag的方式来标记帧事件,在程序中设置回调。然后根据tag名来判断是否是需要的帧事件。这里我有两个担心,首先是效 率问题,不知当帧事件多的时候,监听运行起来效率如何。第二是当效率低自动抽帧时,会不会将事件帧抽掉,导致没有事件出现。但愿我的担心是多余的。

Demo 下载:http://download.csdn.net/detail/fansongy/6621423

本篇博客出自阿修罗道,转载请注明出处,不得用于商业用途:http://blog.csdn.net/fansongy/article/details/16991385

转载于:https://www.cnblogs.com/dudu580231/p/4983785.html

实习小白::(转) Cocos2d-x 3.0开发(十三)使用CocoStudio编辑帧事件并关联到程序...相关推荐

  1. 实习小白::(转) Cocos2d-x 3.0开发(五)关联程序逻辑与cocoStudio导出文件

    1.概述 上篇说到将CocoStudio的导出文件在程序中运行出来,但是并没有用户交互,即点击响应,程序的逻辑判断也都没有.这篇中我们把它们加进去,这样就可以算一个完整的程序了.先上个图: 运行后,点 ...

  2. 实习小白::(转) Cocos2d-x 3.0 开发(八)骨骼动画的动态换肤

    1.   概述 游戏中人物的状态会发生改变,而这种改变通常要通过局部的变化来表现出来.比如获得一件装备后人物形象的改变,或者战斗中武器.防具的损坏等.这些变化的实现就要通过动态换肤来实现.在接下来的这 ...

  3. 转自:拜小白教你OpenCV3.2.0+VS2017开发环境配置

    拜小白教你OpenCV3.2.0+VS2017开发环境配置 本文转载自<拜小白教你OpenCV3.2.0+VS2017开发环境配置>.转载链接. https://blog.csdn.net ...

  4. 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0

    图文并茂使用CocosBuilder制作Cocos2D游戏  分享0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创,翻译:Iven,张作宸,Butterfly ...

  5. Cocos2d-x 3.0开发(五)关联程序逻辑与cocoStudio导出文件

    本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/12795299 1.概述 上篇说到将CocoStudio的导出文件在 ...

  6. 大学毕业没有实习经历_我是如何在大学毕业后没有实习的情况下获得第一份开发人员工作的...

    大学毕业没有实习经历 by Tim Park 蒂姆·帕克(Tim Park) 我是如何在大学毕业后没有实习的情况下获得第一份开发人员工作的 (How I got my first developer ...

  7. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...

    <小白7天入门PHP Web开发>系列文章,面向单纯善良的完全不懂Web开发编程的入门速成课程,小白们如果感兴趣可以研读此系列文章,也可以连线提问.各路大神有何指教还请指点一二.希望各路大 ...

  8. ibm服务器的虚拟控制台,IBM Worklight 6.0 - 开发服务器/控制台问题

    在Worklight v5.0.6中预览Worklight Console的MBS中的混合应用程序非常简单,因为它的工作原理非常简单.IBM Worklight 6.0 - 开发服务器/控制台问题 W ...

  9. Struts 2创始人Patrick Lightbody看《精通Struts 2:Web 2.0开发实战 》

    <精通Struts 2:Web 2.0开发实战 > Apache Struts是目前最成功开源项目之一.除了一些基础性项目如Linux.MySQL以及若干编程语言外,很少有开源框架能像St ...

最新文章

  1. 12- Library at ROM
  2. 基于Walle的多渠道快速打包自动脚本
  3. 学习蛙泳过程用到的一些资料
  4. php rewrite url_PHP实现url重写和.htaccess
  5. mysql架设_主从mysql架设
  6. energy in transition课文翻译_备战四六 | 四六级翻译常考固定表达,速记!
  7. linux/npm/git的简单操作
  8. JavaWeb:cookies和storage的区别
  9. 开放源代码机器人控制软件
  10. 设计一个巴特沃斯低通滤波器
  11. (XWZ)的python学习笔记Ⅵ——进程和线程
  12. After Effects 自动导入素材和分类的脚本
  13. 判断linux文件、文件夹是否存在
  14. JsonParseException: Unexpected character (‘sss‘ (code xxx)): was expecting a colon to separ
  15. Linux(五)Linux远程连接管理工具xftp,xshell使用
  16. Jupyter notebook 配置无问题 但就是无法远程访问,解决方法
  17. 电气-接触器与空气开关
  18. 用Python吐槽国产综艺节目!
  19. LDO与三端稳压器详解
  20. 基因编辑新进展:利用CRISPR/Cas9和iPSC技术构建出首个急性髓系白血病进展模型

热门文章

  1. html增加点击进入,html中实现回车或点击进入-----Mr.Zhang
  2. 增加 oracle服务名,oracle本地服务名配置说明
  3. 怎么设置ppt页面的长度和宽度_在PPT中将照片变裸眼3D效果怎样操作?分享技巧,帮你快速实现...
  4. 抽象工厂模式java_面试官:说一下静态工厂模式,工厂方法模式,抽象工厂的区别吧...
  5. iic裸机与linux通信,基于IIC协议的Linux操作系统与裸机通信的方法
  6. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
  7. MySQL statefulset_Kubernetes进阶之StatefulSet有状态部署
  8. mats显卡测试软件的使用教程,MATS使用说明
  9. android mvc mvp 区别,谈谈Android框架 MVC、MVP、MVVM的区别
  10. vue根据索引删除数组中的一个对象_Vue实现动态添加或者删除对象和对象数组的操作方法...