原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38821319
class CC_DLL CCAction : public CCObject { public: CCAction(void); virtual ~CCAction(void); const char* description(); // virtual CCObject* copyWithZone(CCZone *pZone); // 动作是否完成 virtual bool isDone(void); // 在动作开始之前被调用,它将设置一个target virtual void startWithTarget(CCNode *pTarget); // 在动作完成后调用,它将把target设置为空。注意,不要调用这个方法,取而代之的十target->stopAction(action) virtual void stop(void); // 调用每一帧。注意:不要重构它,除非你确保自己在做什么 virtual void step(float dt); /** *每帧会调用一次,time是一个0~1之间的值 * * For example: * - 0 意味着动作刚开始 * - 0.5 意味着动作处于中间 * - 1 意味着动作结束了 **/ virtual void update(float time); // 获取/设置动作的target inline CCNode* getTarget(void) { return m_pTarget; } inline void setTarget(CCNode *pTarget) { m_pTarget = pTarget; } // 获取/设置动作最初的target(一般不调用set) inline CCNode* getOriginalTarget(void) { return m_pOriginalTarget; } inline void setOriginalTarget(CCNode *pOriginalTarget) { m_pOriginalTarget = pOriginalTarget; } // 获取/设置Tag inline int getTag(void) { return m_nTag; } inline void setTag(int nTag) { m_nTag = nTag; } public: // 创建一个Action static CCAction* create(); protected: CCNode *m_pOriginalTarget; CCNode *m_pTarget; int m_nTag; };
CCMoveTo *move = CCMoveTo::create(2.0f, cpp(50, 50));
class CC_DLL CCActionManager : public CCObject { public: CCActionManager(void); ~CCActionManager(void); // 为指定目标添加动作 void addAction(CCAction *pAction, CCNode *pTarget, bool paused); // 删除所有动作 void removeAllActions(void); // 删除制定目标所有动作 void removeAllActionsFromTarget(CCObject *pTarget); // 删除指定动作 void removeAction(CCAction *pAction); //根据标签删除/获取指定动作 void removeActionByTag(unsigned int tag, CCObject *pTarget); CCAction* getActionByTag(unsigned int tag, CCObject *pTarget); // 获取目标的动作数 unsigned int numberOfRunningActionsInTarget(CCObject *pTarget); // 暂停目标动作 void pauseTarget(CCObject *pTarget); // 恢复目标动作 void resumeTarget(CCObject *pTarget); // 暂停所有运行中的动作 CCSet* pauseAllRunningActions(); // 恢复指定集合所有动作 void resumeTargets(CCSet *targetsToResume); ... }; // 以上是CCActionManager源码分析 // 使用示例如下 pNode->runAction(CCScaleBy::create(2, 2)); CCDirector * pDirector = CCDirector::shareDirector(); pDirector->getActionManager()->pauseTarget(pNode); pDirector->getActionManager()->resumeTarget(pNode);
注意:不要轻易使用动作管理类,除非是不同动作目标或者暂停重启动作。
// times是执行pAction的次数,而CCRepeat则是重复执行直到stop static CCRepeat * create(CCFiniteTimeAction *pAction, unsigned int times); static CCRepeatForever *create(CCActionInterval *pAction);
CCSequence::create(move, move_back, NULL);// 记得在动作序列的结尾加上NULL
我们一般在做某个一个Action的时候,我们需要返回会用到该sprite的reverse,但是又时候,我需要这种行为再reverse的时候,我就可以利用CCReverseTime达到这种效果,例子代码如下:
CCSprite *spriteTint = CCSprite::create("blocks.png"); spriteTint->setPosition(ccp(size.width / 2.0f, size.height / 2.0f)); this->addChild(spriteTint, 1); CCActionInterval *forwardBy = CCTintBy::create(4, 255, 0, 0); CCActionInterval *back = forwardBy->reverse(); CCReverseTime *reverseTime = CCReverseTime::create(back); //在这里也就是倒序播放它的Action了 CCAction *action = CCSequence::create(forwardBy, back, NULL); spriteTint->runAction(action);
基本动作和组合动作实现了针对CCNode的各种属性改变,但这样改变的速度是不变的,通过CCEaseAction和CCSpeed类可以很方便的修改CCNode执行的速度。
CCSpeed也是一个包装器,可以改变内部动作执行时间。
CCSpeed *speed = CCSpeed::create(CCMoveBy::create(3, cpp(350, 0)), 2.0f);CCEaseAction也是包装器,但是它一般用来让动作执行起来更加自然:
1)EaseIn // 由慢至快
2)EaseOut // 由快至慢
3)EaseInOut // 由慢至快,再由快至慢
4)EaseSineIn // 由慢至快
5)EaseSineOut // 由快至慢
6)EaseSineInOut // 由慢至快,再由快至慢
7)EaseExponentialIn // 由慢至极快
8)EaseExponentialOut // 由极快至慢
9)EaseExponentialInOut // 由慢至极快,再由极快至慢
具体的差异可以通过调试查看。
static CCFollow *create(CCNode *pFollowNode, const CCRect &rect = CCRectZero);通过该方法来创建一个CCFollow跟随动作,可以设置一个跟随范围,离开范围就不再跟随。
void ActionFollow::onEnter() { ActionsDemo::onEnter(); centerSprites(1); CCSize s = CCDirector::sharedDirector()->getWinSize(); m_grossini->setPosition(ccp(-200, s.height / 2)); CCActionInterval* move = CCMoveBy::create(2, ccp(s.width * 3, 0)); CCActionInterval* move_back = move->reverse(); CCSequence* seq = CCSequence::create(move, move_back, NULL); CCAction* rep = CCRepeatForever::create(seq); m_grossini->runAction(rep); this->runAction(CCFollow::create(m_grossini, CCRectMake(0, 0, s.width * 2 - 100, s.height))); }
CCSprite* pSprite = CCSprite::create("Heart.png"); this->addChild(pSprite, 0); auto *scale = CCScaleBy::create(1.0, 1.5); auto *scaleBack = scale->reverse(); auto *scaleForever = CCRepeatForever::create(CCSequence::create(scale, scaleBack, NULL)); pSprite->runAction(scaleForever);
原文地址:http://blog.csdn.net/sfh366958228/article/details/38821319