cocos2dx 想做一些比较炫的效果,单纯依靠引擎封装提供的一些东西毕竟有限,最近项目是用opengl绘制一些效果出来,代码如下:
封装类效果类
GoodDropEffects.h文件
#ifndef __GOODBLOOD_H__
#define __GOODBLOOD_H__
#include "cocos2d.h"
#include "global.h"
USING_NS_CC;
class GoodsTail:public CCNode
{
public:
~GoodsTail();
GoodsTail(){};
void draw();
CREATE_FUNC(GoodsTail)
bool init();
void onDraw();
void setOrigin(CCPoint pos);
void tempfunc(float x1,float y1,float x2,float y2,float d,
float &x3, float &y3,float &x4,float &y4);
Vertex trackpt[101];
std::vector<GLushort> tiarr;
Vec3 color;
GLuint vertexBuffer;
GLuint indexBuffer;
std::vector<Vertex> varray;
CCNode *target;
void setTarget(CCNode* nd);
};
class GoodDropEffects:public CCNode
{
public:
~GoodDropEffects();
GoodDropEffects();
static GoodDropEffects* create(CCNode* parent,int kinds,int droptype,int color,int side,CCPoint pos) //side 0 左边 1右边
{
GoodDropEffects *pRet = new GoodDropEffects();
if (pRet && pRet->init(parent,kinds,droptype,color,side, pos))
{
pRet->autorelease();
parent->addChild(pRet,100);
return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
}
bool init(CCNode* parent,int kinds,int droptype,int color,int side,CCPoint pos);
void PlayEffect(CCPoint src,CCPoint dst);
void AbsorbEffect(float dt);
CCSprite *m_GoodsSp;
long m_sides;
CCPoint m_pos;
GoodsTail *tail[8];
CCParticleSystemQuad* ps[4];
CCSprite *lspr[4];
void callback3(CCNode* sender, void* data);
void InitTail(float r,float g, float b);
CCNode* m_parent;
char goodsnamestr[100];
};
#endif
GoodDropEffects.ccp文件:
#include "GoodDropEffects.h"
#include "SimpleAudioEngine.h"
#include "Characters/Robot.h"
#include "Equipment/crystal.h"
#include "Equipment/EquipBase.h"
#include "Common/EnterStageDataExchange.h"
using namespace CocosDenshion;
void GoodsTail::draw()
{
onDraw();
//CCNode::draw();
}
void GoodsTail::tempfunc(float x1,float y1,float x2,float y2,float d,
float &x3, float &y3,float &x4,float &y4)
{
if(y1-y2==0)
{
x3=x4=x2;
if(x2==x1)
{
y3=y2;
y4=y2;
return ;
}
else if(x2>x1)
{
d=-fabsf(d);
}
else d=fabsf(d);
y3=y2-d;
y4=y2+d;
return ;
}
float k=0;
if(x1-x2==0)
{
k=0;
}
else
{
k=-(x1-x2)/(y1-y2);
}
if(y2>y1)
{
d=fabsf(d);
}
else d=-fabsf(d);
{
x3=-d/sqrt(k*k+1)+x2;
y3=-k*d/sqrt(k*k+1)+y2;
x4=d/sqrt(k*k+1)+x2;
y4=k*d/sqrt(k*k+1)+y2;
}
}
void GoodsTail::onDraw()
{
float d=0;
for(int i=0;i<20;++i)
{
trackpt[i].Position[0]=trackpt[i+1].Position[0];
trackpt[i].Position[1]=trackpt[i+1].Position[1];
}
CCPoint pos;
if(target==0)
pos=getPosition();
else
pos=target->getPosition();
trackpt[20].Position[0]=pos.x; trackpt[20].Position[1]=pos.y;
float maxdis=ccpDistance(CCPoint(trackpt[0].Position[0],trackpt[0].Position[1]),CCPoint(trackpt[20].Position[0],trackpt[20].Position[1]));
maxdis=20;
std::vector<Vertex> ttt;
tiarr.clear();
for(int i=0;i<=20;++i)
{
if(d==0)
{
ttt.push_back(trackpt[i]);
}
else
{
float x3,y3,x4,y4;
if(trackpt[i].Position[0]==trackpt[20].Position[0])
{
d=0;
}
tempfunc(trackpt[i-1].Position[0],trackpt[i-1].Position[1],
trackpt[i].Position[0],trackpt[i].Position[1],d,
x3,y3,x4,y4);
Vertex vt1={
{x3,y3,0}, {color.x,color.y, color.z, 0}, {1, 0}};
Vertex vt2={
{x4,y4,0}, {color.x,color.y, color.z, 0}, {1, 0}};
if(trackpt[i].Position[0]==trackpt[20].Position[0])
{
vt1.Color[3]=0;
vt2.Color[3]=0;
}
trackpt[i].Color[0]=color.x;
trackpt[i].Color[1]=color.y;
trackpt[i].Color[2]=color.z;
ttt.push_back(vt1); ttt.push_back(trackpt[i]); ttt.push_back(vt2);
if(i-1==0)
{
tiarr.push_back(0);
tiarr.push_back(1);
tiarr.push_back(2);
tiarr.push_back(0);
tiarr.push_back(2);
tiarr.push_back(3);
}
else
{
int imax=3*i;
tiarr.push_back(imax-4); tiarr.push_back(imax-3); tiarr.push_back(imax-1);
tiarr.push_back(imax-3); tiarr.push_back(imax-1); tiarr.push_back(imax);
tiarr.push_back(imax-4); tiarr.push_back(imax-5); tiarr.push_back(imax-2);
tiarr.push_back(imax-4); tiarr.push_back(imax-2); tiarr.push_back(imax-1);
}
}
/*if(i>13)
d-=((float)i-13+1)*maxdis*0.001;
else*/
d+=((float)