#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;//摇动的频率
};
对应图
/** @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);
};
对应图
/** @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;
};
对应图
/** @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;
};
效果图:
/** @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;
};
对应图:
/** @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;
};
对应图:
/** @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;
};
对应图
/** @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;
};
对应图:
NS_CC_END
#endif // __ACTION_CCGRID3D_ACTION_H__