cocos2d-x 自定义动态特效背景

来源:互联网 发布:mysql test数据库 编辑:程序博客网 时间:2024/05/20 22:29

由于在游戏中有时候需要用到一些特效,但是用图片生成不是很好。因此自己写了一个用于生成背景特效的类,用来生成简单的背景动画效果。

以下是源码:

BackGroundSqur.h 头文件




#ifndef __BACKGROUNDSQUR_H__
#define __BACKGROUNDSQUR_H__
#include "cocos2d.h"

USING_NS_CC;


class BackGroundSqur : public cocos2d::CCLayer
{
public:
CCDirector *Director;//导演类




CCLayer*  InitWithSprite(int Max_X, int Max_Y, const char *NameString);//带图片的初始化
CCLayer* Init(int Max_X, int Max_Y);//不带图片的初始化
CCLayer * Line();//线形背景
CCLayer * ExtendSqur();//方块扩展
void Release();
public:
static BackGroundSqur* create(int Max_X,int Max_Y);//不带图片的
static BackGroundSqur* create(int Max_X, int Max_Y, const char *NameString);//带图片的
static BackGroundSqur* LineBackGround();//线形
static BackGroundSqur* ExtendSqurBackGround();//方块扩展
private:


CREATE_FUNC(BackGroundSqur);
};
#endif



BackGroundSqur.cpp文件


#include "BackGroundSqur.h"
#include "cocos2d.h"




#define GARYCOLOR ccc3(12, 12, 12)
USING_NS_CC;






BackGroundSqur* BackGroundSqur::create(int Max_X, int Max_Y)
{
BackGroundSqur *pRet = new BackGroundSqur();
pRet->Init(Max_X, Max_Y);
return pRet;
}
BackGroundSqur* BackGroundSqur::create(int Max_X, int Max_Y, const char *NameString)
{
BackGroundSqur *pRet = new BackGroundSqur();
pRet->InitWithSprite(Max_X, Max_Y, NameString);


return pRet;
}






BackGroundSqur* BackGroundSqur::LineBackGround()
{
BackGroundSqur *pRet = new BackGroundSqur();
pRet->Line();


return pRet;
}


//方块扩展
BackGroundSqur* BackGroundSqur::ExtendSqurBackGround()
{
BackGroundSqur *pRet = new BackGroundSqur();
pRet->ExtendSqur();


return pRet;
}


//不带图片
CCLayer* BackGroundSqur::Init(int Max_X, int Max_Y)
{
CCRect MaxSqur = CCRectMake(1, 2, 10, 20);


int Num_X = Max_X;
int Num_Y = Max_Y;


CCLayer *layer = CCLayer::create();
addChild(layer, 0);
//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(10, 50);
CCRepeatForever *RotateRepect1 = CCRepeatForever::create(RotateByAct1);


layer->runAction(RotateRepect1);


for (int i = -2; i <= Num_X + 2; i++)
{
for (int j = 0; j <= Num_Y; j++)
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.3, 1.15);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.2, 1);
CCSequence *ScaleSequence = CCSequence::create(ScaleAct, ScaleAct1, NULL);
CCRepeatForever *ScaleRepect = CCRepeatForever::create(ScaleSequence);
//旋转动作
CCRotateBy *RotateByAct = CCRotateBy::create(2, 90);
CCRepeatForever *RotateRepect = CCRepeatForever::create(RotateByAct);


CCSprite *MaxBackSqur = CCSprite::create();
MaxBackSqur->setColor(GARYCOLOR);//设置方块颜色
if (i % 2 == 0)
MaxBackSqur->setTextureRect(CCRectMake(0, 0, 45, 45));
if (j % 2 == 0)
MaxBackSqur->setTextureRect(CCRectMake(0, 0, 45, 45));
if (i % 2 == 0 && j % 2 == 0)
MaxBackSqur->setTextureRect(CCRectMake(0, 0, 30, 30));
else if (i % 2 != 0 && j % 2 != 0)
{
MaxBackSqur->setTextureRect(CCRectMake(0, 0, 60, 60));
}
MaxBackSqur->setPosition(ccp(90 * i, 90 * j));//设置位置


layer->addChild(MaxBackSqur, 0);//添加精灵
MaxBackSqur->runAction(ScaleRepect);
MaxBackSqur->runAction(RotateRepect);
}
}
return layer;
}










//带图片的初始化
CCLayer*  BackGroundSqur::InitWithSprite(int Max_X, int Max_Y, const char *NameString)
{
int Num_X = Max_X;
int Num_Y = Max_Y;
CCLayer *layer = CCLayer::create();
addChild(layer, 0);
//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(1, 9);
CCRepeatForever *RotateRepect1 = CCRepeatForever::create(RotateByAct1);


layer->runAction(RotateRepect1);


for (int i = -2; i <= Num_X + 2; i++)
{
for (int j = 0; j <= Num_Y; j++)
{


CCSprite *MaxBackSqur = CCSprite::create(NameString);
MaxBackSqur->setColor(GARYCOLOR);//设置方块颜色
MaxBackSqur->setPosition(ccp(90 * i, 90 * j));//设置位置




CCRepeatForever *ScaleRepect;
CCRepeatForever *RotateRepect1;




if (i % 2 == 0)
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.3, 1.15);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.2, 1);
CCSequence *ScaleSequence = CCSequence::create(ScaleAct, ScaleAct1, NULL);
ScaleRepect = CCRepeatForever::create(ScaleSequence);


//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(1, 50);
RotateRepect1 = CCRepeatForever::create(RotateByAct1);
}

if (j % 2 == 0 && i%2 !=0 )
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.3, 1.5);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.2, 1);
CCSequence *ScaleSequence = CCSequence::create(ScaleAct, ScaleAct1, NULL);
ScaleRepect = CCRepeatForever::create(ScaleSequence);


//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(1, 50);
RotateRepect1 = CCRepeatForever::create(RotateByAct1);
}
if (i % 2 == 0 && j % 2 == 0)
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.7, 0.3);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.5, 0.7);
CCSequence *ScaleSequence = CCSequence::create(ScaleAct, ScaleAct1, NULL);
ScaleRepect = CCRepeatForever::create(ScaleSequence);


//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(1, -70);
RotateRepect1 = CCRepeatForever::create(RotateByAct1);
}
else if (i % 2 != 0 && j % 2 != 0)
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.3, 3.0);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.2, 2.0);
CCSequence *ScaleSequence = CCSequence::create(ScaleAct, ScaleAct1, NULL);
ScaleRepect = CCRepeatForever::create(ScaleSequence);


//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(1, -30);
RotateRepect1 = CCRepeatForever::create(RotateByAct1);
}



layer->addChild(MaxBackSqur, 0);//添加精灵
MaxBackSqur->runAction(ScaleRepect);
MaxBackSqur->runAction(RotateRepect1);
}
}
return layer;
}








//线形背景
CCLayer * BackGroundSqur::Line()
{
CCLayer *layer = CCLayer::create();
addChild(layer, 0);
//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(10, 50);
CCRepeatForever *RotateRepect1 = CCRepeatForever::create(RotateByAct1);


layer->runAction(RotateRepect1);


CCSize VisibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取屏幕坐标


int Max_X = VisibleSize.width*0.5 / 15;


for (int i = 0; i <= Max_X; i++)
{
//缩放动作
CCScaleTo  *ScaleAct = CCScaleTo::create(0.3, 1.15);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(0.2, 1);


CCMoveBy *MoveByAct1 = CCMoveBy::create(3, ccp(-100, 0));
CCMoveBy *MoveByAct2 = CCMoveBy::create(3, ccp(100, 0));


CCMoveBy *MoveByAct3 = CCMoveBy::create(3, ccp(100, 0));
CCMoveBy *MoveByAct4 = CCMoveBy::create(3, ccp(-100, 0));


CCSequence *ScaleSequence1 = CCSequence::create(MoveByAct1, MoveByAct2, NULL);
CCRepeatForever *ScaleRepect1 = CCRepeatForever::create(ScaleSequence1);


CCSequence *ScaleSequence2 = CCSequence::create(MoveByAct3, MoveByAct4, NULL);
CCRepeatForever *ScaleRepect2 = CCRepeatForever::create(ScaleSequence2);


CCSprite *MaxBackSqur = CCSprite::create();
MaxBackSqur->setColor(GARYCOLOR);//设置方块颜色


CCSprite *MaxBackSqur1 = CCSprite::create();
MaxBackSqur1->setColor(GARYCOLOR);//设置方块颜色


int Length_X =  (2*i+3)*0.5;//设置矩形的宽度
int Length_Y = VisibleSize.height+14;//设置矩形的长度


MaxBackSqur->setTextureRect(CCRectMake(0, 0, Length_X, Length_Y));
MaxBackSqur1->setTextureRect(CCRectMake(0, 0, Length_X, Length_Y));


MaxBackSqur->setPosition(ccp(30 * i+VisibleSize.width*0.5,VisibleSize.height*0.5));//设置位置
MaxBackSqur1->setPosition(ccp(VisibleSize.width*0.5 - 30 * i, VisibleSize.height*0.5));//设置位置


layer->addChild(MaxBackSqur, 0);//添加精灵
layer->addChild(MaxBackSqur1, 0);//添加精灵


MaxBackSqur->runAction(ScaleRepect1);
MaxBackSqur1->runAction(ScaleRepect2);
}
return layer;
}








//方块扩展
CCLayer * BackGroundSqur::ExtendSqur()
{
CCLayer *layer = CCLayer::create();
addChild(layer, 0);
//旋转动作
CCRotateBy *RotateByAct1 = CCRotateBy::create(4, 90);
CCRepeatForever *RotateRepect1 = CCRepeatForever::create(RotateByAct1);


layer->runAction(RotateRepect1);


CCSize VisibleSize = CCDirector::sharedDirector()->getVisibleSize();//获取屏幕坐标


for (int i = 15; i > 0; i--)
{
CCScaleTo  *ScaleAct = CCScaleTo::create(0.01, 0.5);
CCScaleTo  *ScaleAct1 = CCScaleTo::create(3, 1);
CCScaleTo  *ScaleAct2 = CCScaleTo::create(4, 0.5);
CCSequence *ScaleSequence1 = CCSequence::create(ScaleAct, ScaleAct1, ScaleAct2, NULL);
CCRepeatForever *ScaleRepect2 = CCRepeatForever::create(ScaleSequence1);




CCSprite *MaxBackSqur = CCSprite::create();
MaxBackSqur->setColor(GARYCOLOR);//设置方块颜色


CCSprite *MaxBackSqur1 = CCSprite::create();
MaxBackSqur1->setColor(ccc3(0,0,0));//设置方块颜色


int Length_X = 60 * i + 2;//设置矩形的宽度
int Length_Y = 60 * i + 2;//设置矩形的长度


MaxBackSqur->setTextureRect(CCRectMake(0, 0, Length_X, Length_Y));
MaxBackSqur1->setTextureRect(CCRectMake(0, 0,Length_X - i ,Length_Y-i));


MaxBackSqur->setPosition(ccp(VisibleSize.width*0.5, VisibleSize.height*0.5));//设置位置
MaxBackSqur1->setPosition(ccp(VisibleSize.width*0.5, VisibleSize.height*0.5));//设置位置


layer->addChild(MaxBackSqur, 0);//添加精灵
layer->addChild(MaxBackSqur1, 0);//添加精灵


MaxBackSqur->runAction(ScaleRepect2);
MaxBackSqur1->runAction(ScaleRepect2);
}
return layer;
}


//释放资源
void BackGroundSqur::Release()
{
this->removeAllChildren();
}



使用示例:

1.首先导入头文件

#include "BackGroundSqur.h"

2.实例化一个类,并添加一个层。

//加载背景
//BackGroundSqur *backsqur = BackGroundSqur::create(Num_X, Num_Y, "triangle.png");//用自定义图片加载背景特效
//BackGroundSqur *backsqur = BackGroundSqur::create(Num_X, Num_Y);//默认的方块背景动画特效
//BackGroundSqur *backsqur = BackGroundSqur::LineBackGround();//默认的线形背景动画特效
BackGroundSqur *backsqur = BackGroundSqur::ExtendSqurBackGround();//默认的方块扩展动画特效
CCLayer *layer = backsqur;
addChild(layer, 0);


参数说明:NUM_X : x方向最大的精灵数量。

   Num_Y: y方向上最大的精灵数量。

 第三个参数为你需要自己加载的图片路径。推荐图片尺寸为50*50。


注意:如果您需要释放掉背景动画的精灵资源,请调用

backsqur->Release();//释放背景层资源即可




第一次发表博客,欢迎各位提出批评指正,感激不尽!另,如有需要欢迎转载,请注明出处,谢谢!





0 0
原创粉丝点击