原创文章,转载请注明出处: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