cocos2dx吸蓝效果实现opengl绘制

本文介绍如何在cocos2dx项目中利用OpenGL实现吸蓝效果,通过自定义封装类来绘制特殊视觉效果。
摘要由CSDN通过智能技术生成

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值