// // 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 animParams, std::function 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; }