cocos 动画 触摸事件

来源:互联网 发布:新浪短网址api js 编辑:程序博客网 时间:2024/05/01 07:14

 动画与触摸

动画

动画分为两部分  animation   animate  

将动画类比为连环画,则 animation相当于造书的过程 animate则为快速翻书的动作 通常会再添加一个repeateForever的动作,确保动画一直继续下去

1️⃣animation 首先创建精灵帧缓存,然后将许多图片合成一张大图片与plist文件,加入缓存中

   // 创建获取精灵帧缓存

    auto cache = SpriteFrameCache::getInstance();

    // 从文件中读取精灵帧,加入精灵帧缓存中

    cache->addSpriteFramesWithFile("fish.plist","fish.png");

2️⃣然后创建一个容器用来存放animation,即将一页页的图片放入建册成书

Vector<SpriteFrame *>vec; // 创建一个容器

    char str[20]; // 用来保存图片名称

    for (int i=1; i<22; i++) {

        // 将图片名称保存到str

        sprintf(str, "fish_%d.png",i);

        // 通过图片名获取精灵帧

        auto frame = cache->getSpriteFrameByName(str);

        // 将获取的精灵帧加入容器

        vec.pushBack(frame);

    }

    // 通过容器vec创建动画

    auto animation = Animation::createWithSpriteFrames(vec);

    // 设置帧间隔

    animation->setDelayPerUnit(0.1);

3️⃣然后就是根据连环画书创建animate动作

auto animate = Animate:: create(animation);// 通过动画创建动作

4️⃣设置首页   开始动画

// 通过精灵帧创建精灵sp

    auto fream = cache->getSpriteFrameByName("fish_1.png");

    auto sp = Sprite::createWithSpriteFrame(fream);

//  精灵的常见设置

    sp->setPosition(480, 320);

    addChild(sp);

    sp->runAction(repate);

触摸

触摸动作的实现(多点触摸基本类似)

1️⃣首先要重写父类的触摸事件

 //重写Layer的四个触摸事件的函数(不是必须全部重写,但第一个必须要写,因为在触摸开始的基础上才会有后续的动作,哪怕它为空)

    virtual bool onTouchBegan(Touch *touch, Event *unused_event)override;

    virtual void onTouchMoved(Touch *touch, Event *unused_event)override;

    virtual void onTouchEnded(Touch *touch, Event *unused_event)override;

    virtual void onTouchCancelled(Touch *touch, Event *unused_event)override;

2️⃣init函数中设置监听器与事件分发器

     //   auto listener = EventListenerTouchAllAtOnce::create();  多点触摸的监听

    // 创建一个单点触摸的监听

    auto lisstener = EventListenerTouchOneByOne::create();

    // 指定监听的触摸事件的回调函数

    lisstener->onTouchBegan = CC_CALLBACK_2(touchTest::onTouchBegan, this);// this表示layer

    lisstener->onTouchMoved= CC_CALLBACK_2(touchTest::onTouchMoved, this);

    lisstener->onTouchEnded= CC_CALLBACK_2(touchTest::onTouchEnded, this);

    lisstener->onTouchCancelled= CC_CALLBACK_2(touchTest::onTouchCancelled, this);

    // 获取事件分发器

    auto dispatcher = Director::getInstance()->getEventDispatcher();

   // 用事件分发器  设置监听器与监听的对象

   // 注意:一个监听器只能监听一个对象,可以使用克隆方法,类似于action的克隆 lisstener->clone()

    dispatcher->addEventListenerWithSceneGraphPriority(lisstener, this);

3️⃣重写触摸事件(实现)

void touchTest:: onTouchMoved(Touch *touch, Event *unused_event){

    // 获取触发触摸事件的目标

    auto target =dynamic_cast<Sprite *>(unused_event->getCurrentTarget());

   // 获得当前触摸点的位置

    auto point = touch->getLocation();

    // 获取上一次函数调用时的触摸点的位置

    auto prepoint = touch->getPreviousLocation();

    // 获取触摸对象的Rect

    auto rect = target->getBoundingBox();

    if(rect.containsPoint(prepoint)){

        // 目标随着触摸点的移动而移动

        target->setPosition(point);

        //

    }

}

思考:触摸事件与按钮绑定事件的区别与联系

不同:按钮可以跳转场景,在两个场景间操作,而触摸事件更多强调的是在当前场景下的操作,

触摸是否继承自按钮动作



1 0