• 关于Cocos2d-x的动作和动画


      1.动作,在cocos2d-x中有非常多种的动作,各种移动,旋转,缩放,淡入淡出....等等非常多,但是这些动作只是作用于节点,最常作用于的就是精灵节点。而且我们可以把很多个动作放进一个Sequence类型的动作中,一次性可以执行多个动作。还有很多类似Sequence类型的类型,只是作用不同而已。

      2.帧动画,这种动画是按照一定的速度draw出一定数量的图片,从而达到连环画的效果,也就好比我们一个人的攻击动作分解成很多个步骤,每个步骤都有一张完整的人的图,这时候我们在查看图片的管理器中,连续点击下一张,就会出现连贯的攻击动作,而我们点击的速度其实等价于游戏中的一秒几帧,是可以自己设置的。动画可以直接使用动画帧实现,也可以用动画帧缓冲实现,动画动作也可以直接使用动画帧实现,或者用动画帧缓冲实现。第二种方法比第一种的优势就是效率非常高,它只需第一次把所有图片或者动画加载进缓冲区,然后在需要的时候调用就行了。而第一种方法每一次都要去调用需要的图片或者动画,非常地浪费性能。但是第二种方法需要用到的游戏资源就比第一种的多。第一种只需要很多的动作分解的PNG小图片,而第二种需要会被放进精灵帧缓存的管理所有分解图片的plist文件,还要管理所有动画动作的plist文件,还要一张包含所有动作分解的PNG小图的PNG大图,还要所有的动作分解的PNG小图。第二种方法的核心理念就是先缓存再使用。

      当然,这种性能上的差别只有在大的游戏中才有,所以目前我觉得我只要使用第一种就可以了,毕竟第一种比较好理解。而且制作plist文件感觉很麻烦,而且现在还没有找到什么好的制作工具。

      以上说的动画都是帧动画,还有一种常用的动画是骨骼动画,目前我可以用Spine工具制作骨骼动画,但是自己做的很丑,输出是jason文件,atls文件,PNG大图,jason文件其实是plist文件的前辈。

    1.执行帧动画

    //创建行走的帧动画
    Animation * animation = Animation::create();
    animation->addSpriteFrameWithFile("s_1.png");
    animation->addSpriteFrameWithFile("s_2.png");
    animation->addSpriteFrameWithFile("s_3.png");
    animation->addSpriteFrameWithFile("s_4.png");
    animation->addSpriteFrameWithFile("s_5.png");
    animation->addSpriteFrameWithFile("s_6.png");
    animation->setDelayPerUnit(0.1f);  //设置每张图片之间的时间间隔
    animation->setRestoreOriginalFrame(true);
    //设置动画型的动作
    auto animate = Animate::create(animation);
    this->runAction(RepeatForever::create(animate));

    2.执行一个动作队列

    例子1

     //停止之前的所有动作
    this->stopAllActions();
    sprite->stopAllActions();

    //把帧动画变成跳跃的纹理
    this->setTexture(jump);

    startPosition = size.height / 4;
    JumpTo *jump = JumpTo::create(1, Vec2(200, startPosition), startPosition, 1);
    //回调函数把状态重新设置成行走,执行程序时跳过这个函数,这个函数处于等待被调用的状态,直到有人用它的时候才调用
    CallFunc *call = CallFunc::create([this](){
      setState(0);
    });
    //设置动作队列,先跳跃,再回去调用call,变成行走的动作
    this->runAction(Sequence::create(jump, call, NULL));

    例子2

    //停止之前的所有动作
    this->stopAllActions();
    //sprite->stopAllActions();

    //把帧动画变成受伤的纹理,同时创建一个闪烁的动作
    this->setTexture(creep);
    Blink * hurt = Blink::create(1, 5);

    startPosition = size.height / 4;
    auto moveTo = MoveTo::create(0.5, Vec2(200, startPosition));
    //回调函数把状态重新设置成行走,执行程序时跳过这个函数,这个函数处于等待被调用的状态,直到有人用它的时候才调用
    CallFunc *call = CallFunc::create([this](){
      setState(0);
    });
    //设置动作队列,先闪烁,再移动到默认的位置,再回去调用call,变成行走的动作
    this->runAction(Sequence::create(hurt, moveTo, call, NULL));

    3.执行一个动作队列的过程中延迟一定的时间

    auto setHurtImg = CallFunc::create([this, hurt](){
      this->setSpriteFrame(hurt);
    });

    auto setOldImg = CallFunc::create([this, old](){
      this->setSpriteFrame(old);
    });

    auto hurtAction = Sequence::create(setHurtImg, DelayTime::create(0.2), setOldImg, nullptr);

    this->stopAllActions();
    this->runAction(hurtAction);

    注意:

    1) DelayTime的create方法

    static DelayTime* create ( float d )

    用延迟时间创建DelayTime动作。

    参数
    d 持续时间,以秒为单位。
    返回
    一个自释放的DelayTime对象。

    2) Blink的create方法

    static Blink * create (float duration, int blinks)

    用持续时间和闪现次数创建Blink动作。

    例如

    Blink * hurt = Blink::create(1, 5);

    持续1秒,闪烁5次。

    3) 当this是一个包含myHero子节点的父节点的时候

    this->stopAllActions();  //停止父节点(this)的所有动作和动画,不会停止子节点(myHero)的动作和动画(因为动画是要动作来驱使的,所以动画也算在里面)
    myHero->stopAllActions();  //停止子节点(myHero)的所有动作和动画。

    4)关于一些动作结束后的位置

    auto moveTo = MoveTo::create(1, Vec2(0, block->getContentSize().height));
    block->runAction(Sequence::create(moveTo, NULL));

    这里的block是在Baby实例里面的,这个位移的动作的最终位置为Vec2(0, block->getContentSize().height),其实是在Baby实例里面的位置,不是相对整个屏幕的位置

      

      

  • 相关阅读:
    SVM的新理解
    特征提取,特征选择
    条件随机场
    分类、检测、识别
    matlab fgetl()
    matlab fopen()
    rar ubuntu
    makefile for opencv
    [洛谷P1231] 教辅的组成
    [洛谷P1514]引水入城
  • 原文地址:https://www.cnblogs.com/HangZhe/p/5460245.html
Copyright © 2020-2023  润新知