Cocos2d-x 2.0 之 Actions “三板斧” 之一
之前我们讲解了Cocos2d-x 中的TestCpp工程,它包含了43个小示例。每个示例都是通过Controller.cpp中的CreateTestScene函数创建的场景来进行演示的,从今天起,我们来详细学习每一个示例。今天我们来学习第一个示例:”ActionsTest”。
“ActionsTest”-- 这个工程要演示的是什么节目呢?它演示了精灵的各种动画。包括移动,旋转,缩放,跳跃,色彩变化,以及路径动画,帧动画等。这个示例是学习掌握图片精灵的一个很好的教材。注:虽然很明显,这个”ActionsTest”应该称之为“动作”演示,但我更想说“动作”这个词在表达本节众多动画的演示时太狭窄和片面,没有“动画”这个词合适,所以我在这里称之为“动画”。
为了更好的讲解Actions ,我将本章分为三节课,话为“三板斧”。第一斧子,讲解各种Actions的原理。第二斧子,讲解各种衍生的Actions派生类,第三斧子,在前两斧子的基础上捋一下ActionsTest工程源码。相信三斧子下去,你会对于Cocos2d-x引擎的Actions有个系统的掌握。
好,现在我们开始举起斧子,准备好迎接新知识。
一,动画基类
话说,一切的Actions 都是由基类CCAction派生的,这个类描述了一个基本的动画控制方法。打开CCAction.h,我们来分析一下源码:
[cpp]
#ifndef __ACTIONS_CCACTION_H__
#define __ACTIONS_CCACTION_H__
#include "cocoa/CCObject.h"
#include "cocoa/CCGeometry.h"
#include "platform/CCPlatformMacros.h"
//Cocos2d命名空间
NS_CC_BEGIN
//定义一个枚举值来代表默认Tag无效值
enum {
kCCActionTagInvalid = -1,
}; www.zzzyk.com
//基础动画描述,其规定了一个动画所必须有的属性和接口。
class CC_DLL CCAction : public CCObject
{
public:
//构造与析构
CCAction(void);
virtual ~CCAction(void);
//取得当前动画的描述
const char* description();
//产生一个当前类的实例对象拷贝
virtual CCObject* copyWithZone(CCZone *pZone);
//返回动画是否播放结束了
virtual bool isDone(void);
//设置将要演示本动画的结点,这里称为“演员”好了,在动作开始前调用。
virtual void startWithTarget(CCNode *pTarget);
//设置动画停止结束,并将本动画的“演员”置空。
virtual void stop(void);
//重点:每一帧传入时间流逝值,计算动画的进度。
virtual void step(float dt);
//超级重点:传入进度参数,进行相应的动画播放计算。这个参数time取0~1,比如0代表动画开始播放,0.5代表播放到一半,1代表播放到结尾。本函数是个虚拟函数,所有由CCAction派生的子类都可以重载此函数来处理自已的动画算法以达到不同的动画效果,比如移动动画,那这里可以进行移动插值算法,淡入淡出动画,可以进行淡入淡出插值算法。
virtual void update(float time);
//取得当前表演该动画的“演员”,哈,我们姑且用“演员”来表示演示动画的结点。
inline CCNode* getTarget(void) { return m_pTarget; }
//设置当前表演该动画的“演员”
inline void setTarget(CCNode *pTarget) { m_pTarget = pTarget; }
//取得最初设置的“演员”
inline CCNode* getOriginalTarget(void) { return m_pOriginalTarget; }
//设置最初设置的“演员”
inline void setOriginalTarget(CCNode *pOriginalTarget) { m_pOriginalTarget = pOriginalTarget; }
//取得当前动画的用户标记。你可以设一个查询值,以方便的在外部来寻询到当前动画。
inline int getTag(void) { return m_nTag; }
//设置当前动画的用户标记。
inline void setTag(int nTag) { m_nTag = nTag; }
public:
//创建并返回一个CCAction实例,内部是通过调用create函数来实现。
CC_DEPRECATED_ATTRIBUTE static CCAction* action();
//上面函数的实现。
static CCAction* create();
protected:
//最初设置的“演员”。
CCNode *m_pOriginalTarget;
//当前设置的“演员”。
CCNode *m_pTarget;
//用户标记
int m_nTag;
};
//时间动画:在基础动画的基础上加入了时间控制方面的属性和接口。
class CC_DLL CCFiniteTimeAction : public CCAction
{
public:
//构造与析构
CCFiniteTimeAction()
: m_fDuration(0)
{}
virtual ~CCFiniteTimeAction(){}
//取得动画的时长,单位是秒。
inline float getDuration(void) { return m_fDuration; }
//设置动画的时长,单位是秒。
inline void setDuration(float duration) { m_fDuration = duration; }
//返回一个反向播放的动画,这是什么意思呢?在CCAction的类说明中我们知道它最重要的函数是step和update,依靠step计算出来的进度值传入update来显示相应的动画帧。一般来说时间进度的变化是从0~1,只要我们能让进度从1~0的进度变化就可以实现反向动画。
virtual CCFiniteTimeAction* reverse(void);
protected:
//动画的时长。
float m_fDuration;
};
class CCActionInterval;
class CCRepeatForever;
//可调节目标动画播放速度的动画
class CC_DLL CCSpeed : public CCAction
{
public:
//构造与析构函数
CCSpeed()
: m_fSpeed(0.0)
, m_pInnerAction(NULL)
{}
virtual ~CCSpeed(void);
//取得动画播放速度
inline float getSpeed(void) { return m_fSpeed; }
//设置动画播放速度
inline void setSpeed(float fSpeed) { m_fSpeed = fSpeed; }
//初始化动画,参数一是一个CCActionInterval,它是一个匀速动画,代表了当前可调节速度的动画所控制的动画。参数二是手动指定的动画播放速度。
bool initWithAction(CCActionInterval *pAction, float fSpeed);
//CCAction的函数重载
virtual CCObject* copyWithZone(CCZone *pZone);
virtual void startWithTarget(CCNode* pTarget);
virtual void stop();
virtual void step(float dt);
virtual bool isDone(void);
//产生一个反向播放动画
virtual CCActionI
补充:移动开发 , 其他 ,