CCActionGrid(网格动作2大基类:CCActionGrid3D CCActionTiledGrid(都继承自CCActionGrid )+ 改变网格动作速率的修饰动作)

原创 2014年05月21日 17:34:53

    在TestCpp中的EffectsTest示例中展示了一些屏幕特效,它是将屏幕划分为多个格子,并对这些格子进行了动画处理从而产生出相应的屏幕特效

  Cocos2d-x提供了屏幕画面上的一些基于网格的动画,首先将要渲染的画面输出到一张纹理上,然后跟据屏幕大小创建相应数量的网格,通过对于网格上的顶点进行改变,形成顶点的运动动画,然后将纹理贴在网格上再绘制出来,就能够出现很多屏幕特效了。

主要是涉及到以下几个文件:

CCGrid.h /cpp :网格数据及渲染,包括基本网格数据和3D网格数据,这是数据的基础。

CCActionGrid.h /cpp :网格基本动画,这是动画的基础。

CCActionGrid3D.h/cpp: 3D网格基本动画,这是3D网格动画的基础。

CCActionTiledGrid.h / cpp :网格衍生动画,这是最终的特效实现。


#ifndef __ACTION_CCGRID_ACTION_H__

#define __ACTION_CCGRID_ACTION_H__


#include "CCActionInterval.h"

#include "CCActionInstant.h"


NS_CC_BEGIN


class CCGridBase;


/** @brief Base class for Grid actions */

class CC_DLL CCGridAction : public CCActionInterval//网格动画基类

{

public:

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void startWithTarget(CCNode *pTarget);

<span style="color:#ff0000;">void CCGridAction::startWithTarget(CCNode *pTarget)
{
	//调用时间动画基类的相应函数。
    CCActionInterval::startWithTarget(pTarget);
	//取得网格数据类。
    CCGridBase *newgrid = this->getGrid();

    CCNode *t = m_pTarget;
    //取得演员的对应网格数据。
CCGridBase *targetGrid = t->getGrid();
	//有效性判断,如果演员有网格数据并且已经填充了数据。
    if (targetGrid && targetGrid->getReuseGrid() > 0)
{
	//如果网格数据被激活并且其格子大小与本类实例的网格大小相同。
        if (targetGrid->isActive() && targetGrid->getGridSize().x == m_sGridSize.x
            && targetGrid->getGridSize().y == m_sGridSize.y /*&& dynamic_cast<CCGridBase*>(targetGrid) != NULL*/)
        {
			 //演员的网格数据恢复为原始数据。
            targetGrid->reuse();
        }
        else
        {
            CCAssert(0, "");
        }
    }
    else
{
	//如果演员没有创建网格数据或者网格数据已经恢复为原始顶点。

	 //如果演员的网格数据有效并且是激活状态。
        if (targetGrid && targetGrid->isActive())
        {
			 //将其设为未激活。
            targetGrid->setActive(false);
        }
		 //将当前类实例的网格数据设置给演员之后激活。
        t->setGrid(newgrid);
        t->getGrid()->setActive(true);
    }
}</span>


    virtual CCActionInterval* reverse(void);


    /** initializes the action with size and duration */

//初始化网格的大小和动画的时长。

   virtual bool initWithDuration(float duration, const CCSize& gridSize);


    /** returns the grid */

//返回网格

    virtual CCGridBase* getGrid(void);


public:

    /** creates the action with size and duration */

//创建网格动画 1、格子大小 2、动画时长

    static CCGridAction* create(float duration, const CCSize& gridSize);

protected:

    CCSize m_sGridSize;//格子大小。

};


/** 

 @brief Base class for CCGrid3D actions.

 Grid3D actions can modify a non-tiled grid.

 */

class CC_DLL CCGrid3DAction : public CCGridAction  //3D网格动画基类

{

public:

//取得网格

    virtual CCGridBase* getGrid(void);

 //返回对应网格位置的顶点。

    ccVertex3F vertex(const CCPoint& position);

  //返回对应网格位置的原始顶点。

    ccVertex3F originalVertex(const CCPoint& position);

//设置对应网格位置的顶点。

    void setVertex(const CCPoint& position, const ccVertex3F& vertex);

public:

//创建3d网格

    static CCGrid3DAction* create(float duration, const CCSize& gridSize);

};


/** @brief Base class for CCTiledGrid3D actions */

class CC_DLL CCTiledGrid3DAction : public CCGridAction//派生于CCGridAction的3D格子动画类。

{

public:

   //返回对应位置的格子顶点数据。

    ccQuad3 tile(const CCPoint& position);

   //返回对应位置的原始格子顶点数据。

    ccQuad3 originalTile(const CCPoint& position);

 //设置对应位置的格子数据。

    void setTile(const CCPoint& position, const ccQuad3& coords);


 //返回网格数据。

    virtual CCGridBase* getGrid(void);


public:

//创建瓦片3d网格动画

    static CCTiledGrid3DAction* create(float duration, const CCSize& gridSize);

};


/** @brief CCAccelDeccelAmplitude action */

class CC_DLL CCAccelDeccelAmplitude : public CCActionInterval

//Amplitude 振幅 网格所用的变速动画基类:先加速再减速。    

//要求被修饰action 有amplitude属性 只有继承自上面3个网格动作的动作才会有这个属性 所以可以说是网格所用

{

public:

    virtual ~CCAccelDeccelAmplitude(void);

    /** initializes the action with an inner action that has the amplitude property, and a duration time */

    //初始化 1、被修饰动作 2、时间

bool initWithAction(CCAction *pAction, float duration);


    virtual void startWithTarget(CCNode *pTarget);

    virtual void update(float time);

<span style="color:#ff0000;">void CCAccelDeccelAmplitude::update(float time)
{
	//创建一个f值变为进度的2倍。
    float f = time * 2;
	//如果动画时间大于一半,让进度由1再变为0。
    if (f > 1)
    {
        f -= 1;
        f = 1 - f;
    }
	//使用powf处理来形成一个变速曲线公式来达到变速目的。
    ((CCAccelDeccelAmplitude*)(m_pOther))->setAmplitudeRate(powf(f, m_fRate));
}</span>

    virtual CCActionInterval* reverse(void);


    /** get amplitude rate */

//取得变化率

    inline float getRate(void) { return m_fRate; }

    /** set amplitude rate */

    inline void setRate(float fRate) { m_fRate = fRate; }


public:

    /** creates the action with an inner action that has the amplitude property, and a duration time */

//创建CCAccelDeccelAmplitude动作

    static CCAccelDeccelAmplitude* create(CCAction *pAction, float duration);


protected:

    float m_fRate;

    CCActionInterval *m_pOther;

};


/** @brief CCAccelAmplitude action */

class CC_DLL CCAccelAmplitude : public CCActionInterval

//网格所用的变速动画基类:加速动画

{

public:

    ~CCAccelAmplitude(void);

//初始化

    bool initWithAction(CCAction *pAction, float duration);


//得到 设置速率

    inline float getRate(void) { return m_fRate; }

    inline void setRate(float fRate) { m_fRate = fRate; }


    virtual void startWithTarget(CCNode *pTarget);

    virtual void update(float time);

<span style="color:#ff0000;">//动画更新处理。
void CCAccelAmplitude::update(float time)
{
	//创建变速曲线来设置控制动画的速率。
((CCAccelAmplitude*)(m_pOther))->setAmplitudeRate(powf(time, m_fRate));
//更新控制动画。
    m_pOther->update(time);
}</span>

    virtual CCActionInterval* reverse(void);


public:

//创建

    static CCAccelAmplitude* create(CCAction *pAction, float duration);

protected:

    float m_fRate;

    CCActionInterval *m_pOther;

};


/** @brief CCDeccelAmplitude action */

class CC_DLL CCDeccelAmplitude : public CCActionInterval

//网格所用的变速动画基类:减速动画。

{

public:

    ~CCDeccelAmplitude(void);

    /** initializes the action with an inner action that has the amplitude property, and a duration time */

    bool initWithAction(CCAction *pAction, float duration);


    /** get amplitude rate */

    inline float getRate(void) { return m_fRate; }

    /** set amplitude rate */

    inline void setRate(float fRate) { m_fRate = fRate; }


    virtual void startWithTarget(CCNode *pTarget);

    virtual void update(float time);

    virtual CCActionInterval* reverse(void);


public:

    /** creates the action with an inner action that has the amplitude property, and a duration time */

    static CCDeccelAmplitude* create(CCAction *pAction, float duration);


protected:

    float m_fRate;

    CCActionInterval *m_pOther;

};


/** @brief CCStopGrid action.

 @warning Don't call this action if another grid action is active.

 Call if you want to remove the the grid effect. Example:

 CCSequence::actions(Lens::action(...), CCStopGrid::action(...), NULL);

 */

class CC_DLL CCStopGrid : public CCActionInstant//停止网格动画。

{

public:

    virtual void startWithTarget(CCNode *pTarget);

<span style="color:#ff0000;">//设置演示当前动画的演员。
void CCStopGrid::startWithTarget(CCNode *pTarget)
{
	//调用基类的相应函数。
    CCActionInstant::startWithTarget(pTarget);
	//取得演员所用的网格数据。
    CCGridBase *pGrid = m_pTarget->getGrid();
    if (pGrid && pGrid->isActive())
{
	//如果是激活状态,取消激活。
        pGrid->setActive(false);
    }
}</span>

public:

    /** Allocates and initializes the action */

    static CCStopGrid* create(void);

};


/** @brief CCReuseGrid action */

class CC_DLL CCReuseGrid : public CCActionInstant//恢复网格动画。

{

public:

    /** initializes an action with the number of times that the current grid will be reused */

    bool initWithTimes(int times);


    virtual void startWithTarget(CCNode *pTarget);


public:

    /** creates an action with the number of times that the current grid will be reused */

    static CCReuseGrid* create(int times);

protected:

    int m_nTimes;

};

NS_CC_END


#endif // __ACTION_CCGRID_ACTION_H__


Cocos2d-x3.2 Grid3D网格动作

USING_NS_CC;   class GameScene : public cocos2d::Layer { public:     static cocos2d::...
  • fanzhang1990
  • fanzhang1990
  • 2014年10月15日 17:59
  • 5059

cocos2dx -- 网格动画基础 CCGridBase CCGrid3D CCTiledGrid3D

CCGridBase: 是网格基类,定义网格得基本行为,包括设置投影矩阵,设置屏幕画面渲染到纹理的处理器和存储格子大小。 CCGrid3D:3D网格类,储存所有的顶点。所以,该类能够表现出网格的顶点...
  • wuanshi5
  • wuanshi5
  • 2015年05月04日 16:26
  • 771

CCGrid(CCGridBase CCGrid3D CCTiledGrid3D CCGridBase)

#ifndef __EFFECTS_CCGRID_H__ #define __EFFECTS_CCGRID_H__ #include "cocoa/CCObject.h" ...
  • sssssNian
  • sssssNian
  • 2014年05月21日 19:05
  • 757

24、Cocos2dx 3.0游戏开发找小三之网格动作:高炫酷的3D动作

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30476133 网格动作类似于动作特效,可以实现翻...
  • danielzzu
  • danielzzu
  • 2014年07月09日 13:30
  • 3210

cocos2dx-3.2 3DAction 一些3D特效

ffffsffsfsff 目录(?)[+] ~~~~我的生活,我的点点滴滴!! 网格属性就像是一个个交叉形成的一系列的矩形。任何Node对象(La...
  • samrtian
  • samrtian
  • 2014年10月07日 07:48
  • 916

Unity中关于Grid的动态加载

在做项目的时候发现 有很多诸如图片之类的东西需要在程序运行的时候动态加载,那么用NGUI自带的ScrollViewll来实现这个功能是比较好的,但是我不清楚程序在运行的时候到底需要加载多少个这样的对象...
  • qq_17540945
  • qq_17540945
  • 2015年03月02日 13:28
  • 1868

【Cocos2d-X开发学习笔记】第20期:网格动作类的使用

在这一期中,我们将会学习到一些引擎中非常炫的动作类,它们可不再仅仅是局限在2D画面的动作了,而是一 些3D动作。网格动作类类似于特效,可以实现翻转、抖动、震荡、水波纹等效果。     一、网格动作类 ...
  • yangyu20121224
  • yangyu20121224
  • 2013年08月17日 10:39
  • 2464

Cocos2d-x CCGridBase网格动作

网格动作类似于特效,可以实现翻转、抖动、震荡、水波纹等效果。Cocos2D-x中,网格类的基类CCGridBase有两个子类,即CCGrid3D和CCTiledGrid3D。这两个类的共同点是,网格的...
  • zcmain
  • zcmain
  • 2013年10月31日 22:01
  • 1985

cocos2d-x 特效(网格动作)

Cocos2d-x 提供了很多特效,这些特效事实上属于间隔动作。特效类GridAction类也称为网格动作。 GridAction类有两个主要子类Grid3DAction和TiledGridActi...
  • jskafkashd
  • jskafkashd
  • 2016年04月28日 11:43
  • 140

Jsp的九大对象,七大动作,三大指令

jsp九大内置对象: 1>out 向客户端输出数据,字节流.如out.print(" dgaweyr");   2>request 接收客户端的http请求. String getParame...
  • u010897406
  • u010897406
  • 2015年11月03日 16:45
  • 17173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CCActionGrid(网格动作2大基类:CCActionGrid3D CCActionTiledGrid(都继承自CCActionGrid )+ 改变网格动作速率的修饰动作)
举报原因:
原因补充:

(最多只允许输入30个字)