使用CocoStudio编辑帧事件并关联到程序

前端之家收集整理的这篇文章主要介绍了使用CocoStudio编辑帧事件并关联到程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_2@

Cocos2d-x 3.0开发(十三)使用CocoStudio编辑帧事件并关联到程序@H_404_2@

分类Cocos2D-X@H_404_2@

目录(?)@H_404_2@[+]

1、概述


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


@H_404_2@


@H_404_2@


2、用途与原理


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

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

@H_404_2@

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

3、设置帧事件


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

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


@H_404_2@


@H_404_2@

@H_404_2@

4、创建新工程


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

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

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


5、载入动画


@H_404_2@

更改init:@H_404_2@


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

运行,可见动画播放。@H_404_2@


6、监听帧事件


在类中添加一个函数:@H_404_2@

    void@H_404_2@onFrameEvent(Bone*bone,@H_404_2@const@H_404_2@string&evt,@H_404_2@int@H_404_2@originFrameIndex,87); background-color:inherit; font-weight:bold">int@H_404_2@currentFrameIndex);@H_404_2@@H_404_2@

并在cpp中实现:@H_404_2@

    void@H_404_2@HelloWorld::onFrameEvent(Bone*bone,87); background-color:inherit; font-weight:bold">int@H_404_2@currentFrameIndex)@H_404_2@@H_404_2@
  1. if@H_404_2@(strcmp(evt,@H_404_2@"110"@H_404_2@)==0)@H_404_2@@H_404_2@
  2. ActionInterval*action=ShatteredTiles3D::create(0.8f,Size(30,30),5,false@H_404_2@);@H_404_2@@H_404_2@
  3. this@H_404_2@->runAction(action);@H_404_2@@H_404_2@
  4. }@H_404_2@
  5. }@H_404_2@

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

最后在init中注册:@H_404_2@


@H_224_403@ arm->getAnimation()->setFrameEventCallFunc(@H_404_2@this@H_404_2@,frameEvent_selector(HelloWorld::onFrameEvent));@H_404_2@@H_404_2@

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


    //声明@H_404_2@@H_404_2@@H_404_2@
  1. void@H_404_2@checkAction(@H_404_2@float@H_404_2@dt);@H_404_2@@H_404_2@
  2. //实现@H_404_2@@H_404_2@@H_404_2@
  3. void@H_404_2@HelloWorld::checkAction(@H_404_2@float@H_404_2@dt)@H_404_2@@H_404_2@
  4. if@H_404_2@(@H_404_2@this@H_404_2@->getNumberOfRunningActions()==0&&@H_404_2@this@H_404_2@->getGrid()!=nullptr)@H_404_2@@H_404_2@
  5. this@H_404_2@->setGrid(nullptr);@H_404_2@@H_404_2@
  6. //注册@H_404_2@@H_404_2@@H_404_2@
  7. schedule(schedule_selector(HelloWorld::checkAction));@H_404_2@

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

7、总结


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


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

猜你在找的Cocos2d-x相关文章