CCActionGrid3D(一些基础网格动作(操控网格数据实现)CCWaves3D CCFlipX3D CCRipple3D CCShaky3D CCLiquid CCTwirl)

#ifndef __ACTION_CCGRID3D_ACTION_H__

#define __ACTION_CCGRID3D_ACTION_H__


#include "CCActionGrid.h"


NS_CC_BEGIN


/** 

@brief CCWaves3D action 

*/

class CC_DLL CCWaves3D : public CCGrid3DAction

{

public:

//得到 设置振幅

    inline float getAmplitude(void) { return m_fAmplitude; }

    inline void setAmplitude(float fAmplitude) { m_fAmplitude = fAmplitude; }


//得到 设置频率

    inline float getAmplitudeRate(void) { return m_fAmplitudeRate; }

    inline void setAmplitudeRate(float fAmplitudeRate) { m_fAmplitudeRate = fAmplitudeRate; }


    /** initializes an action with duration, grid size, waves and amplitude */

//初始化 1、时间 2、网格大小 3、波浪数 4、振幅

    bool initWithDuration(float duration, const CCSize& gridSize, unsigned int waves, float amplitude);


    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">//更新动画。
void CCWaves3D::update(float time)
{
	//双循环遍历格子。
    int i, j;
    for (i = 0; i < m_sGridSize.x + 1; ++i)
    {
        for (j = 0; j < m_sGridSize.y + 1; ++j)
        {
			 //取出当前格子原始顶点,对z值进行sin曲线的变化加值。形成来回摇动的效果。
            ccVertex3F v = originalVertex(ccg(i ,j));
            v.z += (sinf((float)M_PI * time * m_nWaves * 2 + (v.y+v.x) * .01f) * m_fAmplitude * m_fAmplitudeRate);
            CCLog("v.z offset is %f\n", (sinf((float)M_PI * time * m_nWaves * 2 + (v.y+v.x) * .01f) * m_fAmplitude * m_fAmplitudeRate));
			 //将顶点设置到格子中。
            setVertex(ccg(i, j), v);
        }
    }
}</span>

public:

    /** creates an action with duration, grid size, waves and amplitude */

//创建一个波浪动画,参一为波浪动画摇动的次数,参二为波浪的振幅,参三为格子的大小,参四为动画时长

    static CCWaves3D* create(float duration, const CCSize& gridSize, unsigned int waves, float amplitude);

protected:

    unsigned int m_nWaves;//波浪摇动的次数。

    float m_fAmplitude;//摇动的振幅

    float m_fAmplitudeRate;//摇动的频率

};

对应图

1356627800_3821.jpg


/** @brief CCFlipX3D action */

class CC_DLL CCFlipX3D : public CCGrid3DAction //绕X轴翻转。

{

public:

    /** initializes the action with duration */

    virtual bool initWithDuration(float duration);

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

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">//动画更新。
void CCFlipX3D::update(float time)
{
    //角度,从0~180变化。
    float angle = (float)M_PI * time; // 180 degrees
    //计算其sin值
    float mz = sinf(angle);
    //对基除2后计算cos值。
    angle = angle / 2.0f; // x calculates degrees from 0 to 90
    float mx = cosf(angle);
    //定义临时变量。
    ccVertex3F v0, v1, v, diff;
    //
    v0 = originalVertex(ccg(1, 1));
    v1 = originalVertex(ccg(0, 0));
    //
    float    x0 = v0.x;
    float    x1 = v1.x;
    float x;
    ccGridSize    a, b, c, d;
    //
    if ( x0 > x1 )
    {
        // Normal Grid
        a = ccg(0,0);
        b = ccg(0,1);
        c = ccg(1,0);
        d = ccg(1,1);
        x = x0;
    }
    else
    {
        // Reversed Grid
        c = ccg(0,0);
        d = ccg(0,1);
        a = ccg(1,0);
        b = ccg(1,1);
        x = x1;
    }
    //
    diff.x = ( x - x * mx );
    diff.z = fabsf( floorf( (x * mz) / 4.0f ) );
    //取得左下角顶点,设置X和Z值。
    v = originalVertex(a);
    v.x = diff.x;
    v.z += diff.z;
    setVertex(a, v);
    //取得左上角顶点。计算X和Z值。
    v = originalVertex(b);
    v.x = diff.x;
    v.z += diff.z;
    setVertex(b, v);
    //取得右下角顶点。计算X和Z值。
    v = originalVertex(c);
    v.x -= diff.x;
    v.z -= diff.z;
    setVertex(c, v);
    //取得右上角顶点。计算X和Z值。
    v = originalVertex(d);
    v.x -= diff.x;
    v.z -= diff.z;
    setVertex(d, v);
}</span>

public:

    /** creates the action with duration */

    static CCFlipX3D* create(float duration);

};

对应图

1356627846_5866.jpg




/** @brief CCFlipY3D action */

class CC_DLL CCFlipY3D : public CCFlipX3D

{

public:

    virtual void update(float time);

    virtual CCObject* copyWithZone(CCZone* pZone);


public:

    /** creates the action with duration */

    static CCFlipY3D* create(float duration);

};


/** @brief CCLens3D action */

class CC_DLL CCLens3D : public CCGrid3DAction

{

public:

    /** Get lens center position */

    inline float getLensEffect(void) { return m_fLensEffect; }

    /** Set lens center position */

    inline void setLensEffect(float fLensEffect) { m_fLensEffect = fLensEffect; }

    /** Set whether lens is concave */

    inline void setConcave(bool bConcave) { m_bConcave = bConcave; }

  

    inline const CCPoint& getPosition(void) { return m_position; }

    void setPosition(const CCPoint& position);


    /** initializes the action with center position, radius, a grid size and duration */

    bool initWithDuration(float duration, const CCSize& gridSize, const CCPoint& position, float radius);

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);


public:

    /** creates the action with center position, radius, a grid size and duration */

    static CCLens3D* create(float duration, const CCSize& gridSize, const CCPoint& position, float radius);

protected:

    /* lens center position */

    CCPoint m_position;

    float m_fRadius;

    /** lens effect. Defaults to 0.7 - 0 means no effect, 1 is very strong effect */

    float m_fLensEffect;

    /** lens is concave. (true = concave, false = convex) default is convex i.e. false */

    bool m_bConcave;


    bool    m_bDirty;

};

对应图

1356627900_5587.jpg


/** @brief CCRipple3D action */

class CC_DLL CCRipple3D : public CCGrid3DAction  //Ripple 波纹 涟漪  涟漪3D网格特效。

{

public:

//得到 设置中心位置

    inline const CCPoint& getPosition(void) { return m_position; }

    void setPosition(const CCPoint& position);

//振幅

    inline float getAmplitude(void) { return m_fAmplitude; }

    inline void setAmplitude(float fAmplitude) { m_fAmplitude = fAmplitude; }

//频率

    inline float getAmplitudeRate(void) { return m_fAmplitudeRate; }

    inline void setAmplitudeRate(float fAmplitudeRate) { m_fAmplitudeRate = fAmplitudeRate; }


//初始化涟漪3D网格动作 1、时间 2、格子大小 3、中心位置   4、半径 5、波浪数 6、振幅 

bool initWithDuration(float duration, const CCSize& gridSize, const CCPoint& position, float radius, unsigned int waves, float amplitude);

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">void CCRipple3D::update(float time)
{
    int i, j;
//双循环遍历每个格子。
    for (i = 0; i < (m_sGridSize.x+1); ++i)
    {
        for (j = 0; j < (m_sGridSize.y+1); ++j)
        {
            //取得格子的原始顶点。
            ccVertex3F v = originalVertex(ccg(i, j));
            //计算顶点与中心点的位置之差。
            CCPoint vect = ccpSub(m_position, ccp(v.x,v.y));
            //计算出顶点与中心点的距离。
            float r = ccpLength(vect);
            //如果在半径范围内。通过距离做为参数按照sin曲线公式计算出相应的Z值偏移。
            if (r < m_fRadius)
            {   
                r = m_fRadius - r;
                float rate = powf(r / m_fRadius, 2);
                v.z += (sinf( time*(float)M_PI * m_nWaves * 2 + r * 0.1f) * m_fAmplitude * m_fAmplitudeRate * rate);
            }
            //将偏移后的顶点设置给格子。
            setVertex(ccg(i, j), v);
        }
    }
}</span>

public:

//创建

    static CCRipple3D* create(float duration, const CCSize& gridSize, const CCPoint& position, float radius, unsigned int waves, float amplitude);

protected:

    /* center position */

    CCPoint m_position;

    float m_fRadius;

    unsigned int m_nWaves;

    float m_fAmplitude;

    float m_fAmplitudeRate;

};

效果图:

1356627987_6000.jpg




/** @brief CCShaky3D action */

class CC_DLL CCShaky3D : public CCGrid3DAction //Shaky 摇晃的  3D摇动的网格动画

{

public:

    /** initializes the action with a range, shake Z vertices, a grid and duration */

//初始化 1、时间 2、格子大小 3、范围 4、是否在z轴 shake(摇动)

    bool initWithDuration(float duration, const CCSize& gridSize, int range, bool shakeZ);

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">//动画更新。
void CCShaky3D::update(float time)
{
    CC_UNUSED_PARAM(time);
    int i, j;
    //双循环遍历所有格子。
    for (i = 0; i < (m_sGridSize.x+1); ++i)
    {
        for (j = 0; j < (m_sGridSize.y+1); ++j)
        {
            //取得格子的原始顶点。
            ccVertex3F v = originalVertex(ccg(i ,j));
            //对顶点的x,y进行随机的的加成。
            v.x += (rand() % (m_nRandrange*2)) - m_nRandrange;
            v.y += (rand() % (m_nRandrange*2)) - m_nRandrange;
            //如果需要Z值的摇动,对顶点的z进行随机的的加成。
            if (m_bShakeZ)
            {
                v.z += (rand() % (m_nRandrange*2)) - m_nRandrange;
            }
            //将顶点设置到相应格子中。
            setVertex(ccg(i, j), v);
        }
    }
}</span>

public:

//创建

    static CCShaky3D* create(float duration, const CCSize& gridSize, int range, bool shakeZ);

protected:

    int m_nRandrange;

    bool m_bShakeZ;

};

对应图:

1356628059_5406.jpg


/** @brief CCLiquid action */

class CC_DLL CCLiquid : public CCGrid3DAction //Liquid液体 流体效果的3D网格动画。

{

public:

//振幅

    inline float getAmplitude(void) { return m_fAmplitude; }

    inline void setAmplitude(float fAmplitude) { m_fAmplitude = fAmplitude; }

//频率

    inline float getAmplitudeRate(void) { return m_fAmplitudeRate; }

    inline void setAmplitudeRate(float fAmplitudeRate) { m_fAmplitudeRate = fAmplitudeRate; }


    /** initializes the action with amplitude, a grid and duration */

//初始化 1、时间 2、格子大小 3、波浪数 4、振幅

    bool initWithDuration(float duration, const CCSize& gridSize, unsigned int waves, float amplitude);

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">void CCLiquid::update(float time)
{
    int i, j;
    //双循环遍历所有的格子。
    for (i = 1; i < m_sGridSize.x; ++i)
    {
        for (j = 1; j < m_sGridSize.y; ++j)
        {
            //取出格子的原始顶点位置。
            ccVertex3F v = originalVertex(ccg(i, j));
            //设置顶点的x,y值。
            v.x = (v.x + (sinf(time * (float)M_PI * m_nWaves * 2 + v.x * .01f) * m_fAmplitude * m_fAmplitudeRate));
            v.y = (v.y + (sinf(time * (float)M_PI * m_nWaves * 2 + v.y * .01f) * m_fAmplitude * m_fAmplitudeRate));
            //将顶点数据设置给相应格子。
            setVertex(ccg(i, j), v);
        }
    }
}</span>

public:

    /** creates the action with amplitude, a grid and duration */

    static CCLiquid* create(float duration, const CCSize& gridSize, unsigned int waves, float amplitude);

protected:

    unsigned int m_nWaves;

    float m_fAmplitude;

    float m_fAmplitudeRate;

};

对应图:

1356628120_3178.jpg



/** @brief CCWaves action */

class CC_DLL CCWaves : public CCGrid3DAction

//波浪效果的网格动画,与CCWaves3D的区别是少了Z值的变化。

{

public:

//振幅

    inline float getAmplitude(void) { return m_fAmplitude; }

    inline void setAmplitude(float fAmplitude) { m_fAmplitude = fAmplitude; }

//频率

    inline float getAmplitudeRate(void) { return m_fAmplitudeRate; }

    inline void setAmplitudeRate(float fAmplitudeRate) { m_fAmplitudeRate = fAmplitudeRate; }


    /** initializes the action with amplitude, horizontal sin, vertical sin, a grid and duration */

//初始化 1、时间 2、格子大小 3、波浪数 4、振幅 5、 横向运动 6、竖向运动

 bool initWithDuration(float duration, const CCSize& gridSize, unsigned int waves, 

float amplitude, bool horizontal(水平的), bool vertical(垂直的));

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">void CCWaves::update(float time)
{
    int i, j;
    //双循环遍历所有格子。
    for (i = 0; i < m_sGridSize.x + 1; ++i)
    {
        for (j = 0; j < m_sGridSize.y + 1; ++j)
        {
            //取得对应格子的顶点。
            ccVertex3F v = originalVertex(ccg(i, j));
            //如果进行横向运动。
            if (m_bVertical)
            {
               //计算X值。
                v.x = (v.x + (sinf(time * (float)M_PI * m_nWaves * 2 + v.y * .01f) * m_fAmplitude * m_fAmplitudeRate));
            }
            //如果进行竖向运动。
            if (m_bHorizontal)
            {   //计算Y值。
                v.y = (v.y + (sinf(time * (float)M_PI * m_nWaves * 2 + v.x * .01f) * m_fAmplitude * m_fAmplitudeRate));
            }
            //将顶点数据设置到相应格子中。
            setVertex(ccg(i, j), v);
        }
    }
}</span>

public:


//创建

    static CCWaves* create(float duration, const CCSize& gridSize, unsigned int waves, float amplitude, bool horizontal, bool vertical);

protected:

    unsigned int m_nWaves;

    float m_fAmplitude;

    float m_fAmplitudeRate;

    bool m_bVertical;

    bool m_bHorizontal;

};

对应图

1356628156_7645.jpg

/** @brief CCTwirl action */

class CC_DLL CCTwirl : public CCGrid3DAction //Twirl:旋转   盘旋扭曲效果的3D网格动画

{

public:

//得到 设置中心位置

    inline const CCPoint& getPosition(void) { return m_position; }

    void setPosition(const CCPoint& position);


    inline float getAmplitude(void) { return m_fAmplitude; }

    inline void setAmplitude(float fAmplitude) { m_fAmplitude = fAmplitude; }


    inline float getAmplitudeRate(void) { return m_fAmplitudeRate; }

    inline void setAmplitudeRate(float fAmplitudeRate) { m_fAmplitudeRate = fAmplitudeRate; }


   //初始化 1、时间 2、格子大小 3、位置 4、旋转次数 5、振幅

    bool initWithDuration(float duration, const CCSize& gridSize, CCPoint position, unsigned int twirls, float amplitude);

    virtual CCObject* copyWithZone(CCZone* pZone);

    virtual void update(float time);

<span style="color:#ff0000;">void CCTwirl::update(float time)
{
int i, j;
//将动画的中心点位置保存到点c中。
    CCPoint    c = m_position;
    //双循环遍历每个格子。
    for (i = 0; i < (m_sGridSize.x+1); ++i)
    {
        for (j = 0; j < (m_sGridSize.y+1); ++j)
        {
            //取得对应格子的顶点。
            ccVertex3F v = originalVertex(ccg(i ,j));
            //取得当前格子与格子中心位置的差。
            CCPoint    avg = ccp(i-(m_sGridSize.x/2.0f), j-(m_sGridSize.y/2.0f));
            //计算当前格子与中心点位置的距离。
            float r = ccpLength(avg);
            //计算振幅。
            float amp = 0.1f * m_fAmplitude * m_fAmplitudeRate;
            //使用cos公式来计算出曲线变化值。
            float a = r * cosf( (float)M_PI/2.0f + time * (float)M_PI * m_nTwirls * 2 ) * amp;
            //计算出一个偏移。
            CCPoint d = ccp(
                sinf(a) * (v.y-c.y) + cosf(a) * (v.x-c.x),
                cosf(a) * (v.y-c.y) - sinf(a) * (v.x-c.x));
            //当前顶点位置为动画中心点位置加上偏移。
            v.x = c.x + d.x;
            v.y = c.y + d.y;
            //将顶点设置给相应的格子。
            setVertex(ccg(i ,j), v);
        }
    }
}</span>

public:

 //创建

    static CCTwirl* create(float duration, const CCSize& gridSize, CCPoint position, unsigned int twirls, float amplitude);

protected:

    /* twirl center */

    CCPoint m_position;

    unsigned int m_nTwirls;

    float m_fAmplitude;

    float m_fAmplitudeRate;

};

对应图:

1356628208_8546.jpg





NS_CC_END


#endif // __ACTION_CCGRID3D_ACTION_H__


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值