AniGardenSpriteAnimator.cpp 4.35 KB
//
//  MapAniActionSequenceHandler.cpp
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 06.06.2017.
//
//

#include "AniGardenSpriteAnimator.h"
#include "AniGeometryUtils.h"
#include "AniMiscUtils.h"

int AniGardenSpriteAnimator::AnimationTagJumpOff = 1;
int AniGardenSpriteAnimator::AnimationTagWaddleOff = 2;
static int WaddleInfinitelyActionTag = 99;

AniGardenSpriteAnimator* AniGardenSpriteAnimator::create(){
    auto animator = new AniGardenSpriteAnimator();
    animator->autorelease();
    return animator;
}

int AniGardenSpriteAnimator::animateSprite(cocos2d::Sprite* sprite, int animationTag, std::vector<AnimParam> animParams, std::function<void()> callback){ //TODO anim params
    if(animationTag == AnimationTagJumpOff){
        bool toZero = animParams[0].boolParam;
        
        auto winWidth = cocos2d::Director::getInstance()->getWinSize().width;
        auto jumpWidth = toZero ? AniGeometryUtils::getBoundingBoxToWorld(sprite).getMinX() - winWidth : winWidth - AniGeometryUtils::getBoundingBoxToWorld(sprite).getMinX();
        auto baseDuration = 2;
        auto baseJumps = 10;

        auto action = cocos2d::Sequence::create(cocos2d::JumpBy::create(baseDuration*abs(jumpWidth)/winWidth, cocos2d::Vec2(jumpWidth,0), sprite->getBoundingBox().size.height, fmax((int)(baseJumps*abs(jumpWidth)/winWidth),1)),
                                                                        cocos2d::FadeOut::create(0.2f),
                                                                        cocos2d::CallFunc::create(callback),
                                                                        nullptr);
        action->setTag(AnimationTagJumpOff);
        sprite->runAction(action);
    } else if(animationTag == AnimationTagWaddleOff){
        bool toZero = animParams[0].boolParam;
        
        auto winWidth = cocos2d::Director::getInstance()->getWinSize().width;
        auto jumpWidth = toZero ? AniGeometryUtils::getBoundingBoxToWorld(sprite).getMinX() - winWidth : winWidth - AniGeometryUtils::getBoundingBoxToWorld(sprite).getMinX();
        auto baseDuration = 2;
        auto wholeDuration = baseDuration*abs(jumpWidth)/winWidth;
        auto baseRotations = 22;
        auto deltaAngle = 14;
//        auto rotations = (int)ceilf(fmax((int)(baseRotations*abs(jumpWidth)/winWidth),1)/2);
        auto halfRotationDuration = 0.2f;// wholeDuration / rotations;
        
//        AniMiscUtils::changeAnchorPoint(sprite, cocos2d::Point(0.5f, 0));

        auto waddleAction = cocos2d::Sequence::create(cocos2d::RotateTo::create(halfRotationDuration/2, -deltaAngle),
                                                      cocos2d::CallFunc::create([sprite, halfRotationDuration, deltaAngle](){
                                                            auto waddleForeverAction = cocos2d::RepeatForever::create(cocos2d::Sequence::create(cocos2d::RotateTo::create(halfRotationDuration, deltaAngle),
                                                                                                                                                cocos2d::RotateTo::create(halfRotationDuration, -deltaAngle), NULL));
                                                            waddleForeverAction->setTag(WaddleInfinitelyActionTag);
                                                            sprite->runAction(waddleForeverAction);
                                                      }), nullptr);

        sprite->runAction(waddleAction);
        auto moveAction = cocos2d::Sequence::create(cocos2d::MoveBy::create(wholeDuration, cocos2d::Vec2(jumpWidth,0)),
                                                cocos2d::FadeOut::create(0.2f),
                                                cocos2d::CallFunc::create([sprite, callback](){
//                                                                AniMiscUtils::changeAnchorPoint(sprite, cocos2d::Point(0.5f, 0.5f));
                                                                sprite->setRotation(0);
                                                                sprite->stopActionByTag(WaddleInfinitelyActionTag);
                                                                callback();
                                                }),
                                                nullptr);
        moveAction->setTag(AnimationTagWaddleOff);
        sprite->runAction(moveAction);
    }
    return AnimationTagUnknownAnimation;
}