做游戏新手引导式必不可少的一部分,使用opengl封装一个新手引导类,可以通用,代码如下:

.h文件

#ifndef __GUIDE_H__
#define __GUIDE_H__

#include "cocos2d.h"
#include "cocos-ext.h"
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#include "gles/gl.h"
#endif
#include "global.h"
using namespace cocos2d::extension;  
USING_NS_CC;

struct Rect{
	float rx,ry,rwidth,rheight;
	Rect(float x,float y,float width,float height)
	{
		rx=x;
		ry=y;
		rwidth=width;
		rheight=height;
	}
	bool operator< (const Rect& r) const{return rx<r.rx;}
	bool containsPoint(const CCPoint& point) const
	{
		bool bRet = false;
		if (point.x >= rx && point.x <=rx+rwidth
			&& point.y >= ry && point.y <=ry+rheight)
		{
			bRet = true;
		}
		return bRet;
	}
};
class Guide : public cocos2d::cclayer
{
public:
	~Guide();
	void clear();
	static void reset();
	static gluint vertexBuffer;
	static gluint indexBuffer;
	float gx,gy,m_width,m_height;
	float cd,m_precd;
	bool bsrcclick;
	static int param;
	static Guide* gthis;
	CCRect m_src;
	int m_type;
	float sumlen,curlen;
	std::string talkstr;
	cclabelTTF* m_talk;
	float tscalex,tscaley,transval;
	static CCGLProgram * pg;
	static void sreset();
	virtual bool init(); 
	void SetTransparent(float val);
	void update(float delta);
	std::map<Rect,CCCallFuncND*> m_monitor,m_premonitor;
	std::map<Rect,CCCallFuncND*> m_strike,m_prestrike;
	void delayjoin1(float dt);
	void delayjoin2(float dt);
	void AddMonitor(Rect rc,CCCallFuncND* cn);
	void AddPierce( Rect rc,CCCallFuncND* cn);
	char* AlignTxt(char* text,float width);
	void onEnter();
	CREATE_FUNC(Guide);
	void SetFocus(float x,float height,bool flag=true,int type=0,CCTexture2D* tex=0);//type:0椭圆 1矩形 2图片形状 
	CCNode* CreateLabel(char* text,float x,float width=0);
	CCNode* CreateArrow(float x,float angle=0);

	static CCRenderTexture * m_circle;
	static CCRenderTexture * m_arrow;
	static CCRenderTexture * m_rc;
	CCTexture2D* texture2d;//做剪裁形状
	static void drawcircle();
	static void drawarrow();
	static void drawrc();

	virtual void draw();
	void onDraw();
	virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);
	virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent);
	virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent);
	virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent);
	void createHand(int dir,CCPoint pt=ccp(-1,-1));
	void createTutor(char *txt,bool ani=false);
	static CCScale9Sprite* CreateTextSprite(char *text,float width=0);
	static cclabelTTF* GetFitLabel(char *text,float width);
};
#endif // __GUIDE_H__

.cpp文件

#include "Guide.h"

const char* shader_frag="\n#ifdef GL_ES\n\
precision lowp float;\
\n#endif\n\
uniform sampler2D CC_Texture0;\
uniform float tval;\
varying vec4 v_fragmentColor;\
varying vec2 v_texCoord;\
void main()\
{\
vec4 color=texture2D(CC_Texture0,v_texCoord);\
	gl_FragColor =vec4(0.0,0.0,(1.0-color.a)*tval);\
}";
const char* shader_vert="attribute vec4 a_position;\
attribute vec2 a_texCoord;\
attribute vec4 a_color;\
\n#ifdef GL_ES\n\
varying lowp vec4 v_fragmentColor;\
\n#else\n\
varying vec4 v_fragmentColor;\
\n#endif\n\
varying vec2 v_texCoord;\
void main()\
{\
	gl_Position = CC_MVPMatrix * a_position;\
	v_fragmentColor = a_color;\
	v_texCoord = a_texCoord;\
}";

unsigned char utf8_look_for_table[] = 
{
	1,1,2,3,4,5,6,1
};
#define UTFLEN(x)  utf8_look_for_table[(x)]
int getUtf8Length(char *str)
{
	int clen = strlen(str);
	int len = 0;
	for(char *ptr = str;*ptr!=0&&len<clen;len++,ptr+=UTFLEN((unsigned char)*ptr));
	return len;
}
char* subUtfString(const char *str,unsigned int start,unsigned int end)
{
	int len = getUtf8Length((char*)str);
	if(start >= len) return NULL;
	if(end > len) end = len;
	char *sptr = (char*)str;
	for(int i = 0; i < start; ++i,sptr+=UTFLEN((unsigned char)*sptr));
	char *eptr = sptr;
	for(int i = start; i < end; ++i,eptr += UTFLEN((unsigned char)*eptr));
	int retLen = eptr - sptr;
	char *retStr = (char*)malloc(retLen+1);
	memcpy(retStr,sptr,retLen);
	retStr[retLen] = 0;
	return retStr;
}
CCGLProgram *Guide::pg=0;
CCRenderTexture *Guide::m_circle=0;
CCRenderTexture *Guide::m_arrow=0;
CCRenderTexture *Guide::m_rc=0;
gluint Guide::vertexBuffer=0;
gluint Guide::indexBuffer=0;
void Guide::clear()
{
/*
	std::map<Rect,CCCallFuncND*>::iterator it;
	for(it=m_monitor.begin();it!=m_monitor.end();++it)
	{
		if(it->second->isSingleReference())
		  it->second->release();
	}
	for(it=m_strike.begin();it!=m_strike.end();++it)
	{
		if(it->second->isSingleReference())
		 it->second->release();
	}
	m_monitor.clear();
	m_strike.clear();*/
}
Guide::~Guide()
{
	/*gluint garr[]={vertexBuffer,indexBuffer};
	glDeleteBuffers(2,garr);*/
	gthis=0;
	std::map<Rect,CCCallFuncND*>::iterator it;
	for(it=m_monitor.begin();it!=m_monitor.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	for(it=m_strike.begin();it!=m_strike.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	m_monitor.clear();
	m_strike.clear();
}
void Guide::drawcircle()
{
	return;
	int seg=20;
	float a=180,b=180,xoff=200,yoff=200,scope=20;
	a+=scope; b+=scope;
	float gap=2*a/seg;
	int k=2*a/gap+1;
	int sumct1=2*k-1;
	a-=scope; b-=scope;
	gap=2*a/seg;
	k=2*a/gap+1;
	int sumct=2*k;
	Vertex *vt=new Vertex[sumct+sumct1];
	glushort* cindex=new glushort[sumct1*2];
	vt[0].Position[0]=xoff;
	vt[0].Position[1]=yoff;
	vt[0].Position[2]=0;
	vt[0].Color[0]=1;
	vt[0].Color[1]=1;
	vt[0].Color[2]=0;
	vt[0].Color[3]=1;
	int count=1;
	for(float i=a+xoff;i>=-a+xoff;i-=gap)
	{
		vt[count].Position[0]=i;
		vt[count].Position[1]=sqrt(1-pow((i-xoff)/a,2))*b+yoff;
		vt[count].Position[2]=0;
		vt[count].Color[0]=0;
		vt[count].Color[1]=1;
		vt[count].Color[2]=0;
		vt[count].Color[3]=0.9;
		++count;
	}
	for(float i=-a+xoff+gap;i<=a+xoff;i+=gap)
	{
		vt[count].Position[0]=i;
		vt[count].Position[1]=-sqrt(1-pow((i-xoff)/a,2))*b+yoff;
		vt[count].Position[2]=0;
		vt[count].Color[0]=0;
		vt[count].Color[1]=1;
		vt[count].Color[2]=0;
		vt[count].Color[3]=0.9;
		++count;
	}
	a+=scope; b+=scope; gap=2*a/seg;
	for(float i=a+xoff;i>=-a+xoff;i-=gap)
	{
		vt[count].Position[0]=i;
		vt[count].Position[1]=sqrt(1-pow((i-xoff)/a,2))*b+yoff;
		vt[count].Position[2]=0;
		vt[count].Color[0]=0;
		vt[count].Color[1]=1;
		vt[count].Color[2]=0;
		vt[count].Color[3]=0;
		++count;
	}
	for(float i=-a+xoff+gap;i<=a+xoff;i+=gap)
	{
		vt[count].Position[0]=i;
		vt[count].Position[1]=-sqrt(1-pow((i-xoff)/a,2))*b+yoff;
		vt[count].Position[2]=0;
		vt[count].Color[0]=0;
		vt[count].Color[1]=1;
		vt[count].Color[2]=0;
		vt[count].Color[3]=0;
		++count;
	}
	int ct1=1,ct2=sumct;
	for(int i=0;i<sumct1*2;++i)
	{
		if(i%2==0)
			cindex[i]=ct1++;
		else
		{
			cindex[i]=ct2++;
		}
	}
	CCGLProgram *tpg=CCshadercache::sharedshadercache()->programForKey(kCCShader_PositionColor);
	tpg->use();
	tpg->setUniformsForBuiltins();
	glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
	glBufferData(GL_ARRAY_BUFFER,sizeof(Vertex)*(sumct+sumct1),vt,GL_STATIC_DRAW);
	GLint _positionLocation = glGetAttribLocation(tpg->getProgram(),"a_position");
	GLint _colorLocation = glGetAttribLocation(tpg->getProgram(),"a_color");
	glEnabLevertexAttribArray(_positionLocation);
	glEnabLevertexAttribArray(_colorLocation);

	glVertexAttribPointer(_positionLocation,GL_FLOAT,GL_FALSE,sizeof(Vertex),(GLvoid*)offsetof(Vertex,Position));
	glVertexAttribPointer(_colorLocation,Color));
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glEnable(GL_POINT_SMOOTH);  
	glHint(GL_POINT_SMOOTH,GL_NICEST);  
	glEnable(GL_LINE_SMOOTH);  
	glHint(GL_LINE_SMOOTH,GL_NICEST);  

	glDrawArrays(GL_TRIANGLE_FAN,sumct);

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBuffer);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(glushort)*sumct1*2,cindex,GL_STATIC_DRAW);
	glDrawElements(GL_TRIANGLE_STRIP,sumct1*2,GL_UNSIGNED_SHORT,0);
	delete []vt;
	delete []cindex;
	gldisable(GL_DEPTH_TEST);
	glBindBuffer(GL_ARRAY_BUFFER,0);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
}
void Guide::drawarrow()
{
	return;
	Vertex vt[]={
		{{25,0},{1,1},1}},{{75,75,{{100,{{50,100,{{3,{{25,1}}
	};
	glushort index[]={
		0,5
	};
	CCGLProgram *tpg=CCshadercache::sharedshadercache()->programForKey(kCCShader_PositionColor);
	tpg->use();
	tpg->setUniformsForBuiltins();
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glEnable(GL_LINE_SMOOTH);  
	glHint(GL_LINE_SMOOTH,GL_NICEST);  

	glBindBuffer(GL_ARRAY_BUFFER,sizeof(vt),GL_STATIC_DRAW);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,sizeof(index),index,"a_color");
	glEnabLevertexAttribArray(_positionLocation);
	glEnabLevertexAttribArray(_colorLocation);
	glVertexAttribPointer(_positionLocation,Color));
	glDrawElements(GL_TRIANGLES,9,0);
	for(int i=0;i<7;++i)
	{
		vt[i].Color[0]=0;
		vt[i].Color[1]=0;
		vt[i].Color[2]=0; vt[i].Color[3]=1;
	}
	glBindBuffer(GL_ARRAY_BUFFER,GL_STATIC_DRAW);
	gllinewidth(1);
	glDrawArrays(GL_LINE_LOOP,7);
	gldisable(GL_DEPTH_TEST);
	glBindBuffer(GL_ARRAY_BUFFER,0);
}
void Guide::drawrc()
{
	return;
	Vertex vt[]={
		{{2,{0,{{398,{{2,398,};
	glushort lindex[]={
		0,2
	};
	CCGLProgram *tpg=CCshadercache::sharedshadercache()->programForKey(kCCShader_PositionColor);
	tpg->use();
	tpg->setUniformsForBuiltins();

	glBindBuffer(GL_ARRAY_BUFFER,Color));

	glDrawArrays(GL_TRIANGLE_STRIP,4);
	for(int i=0;i<4;++i)
	{
		vt[i].Color[0]=0.3;
		vt[i].Color[1]=0.6;
		vt[i].Color[2]=0.2;
		vt[i].Color[3]=1;
	}
	glBindBuffer(GL_ARRAY_BUFFER,sizeof(lindex),lindex,GL_STATIC_DRAW);
	gllinewidth(1);
	glDrawElements(GL_LINE_LOOP,0);
	gldisable(GL_DEPTH_TEST);
	glBindBuffer(GL_ARRAY_BUFFER,0);
}
cclabelTTF* Guide::GetFitLabel(char *text,float width)
{
	cclabelTTF* pLabel = cclabelTTF::create(text,"Arial",24);	
	std::string tempstr=std::string(text),srcstr(text),rs;
	int flag=0,flag1=0,curlen=0,slen=0,offset=0;
	while(1)
	{
		int tplen=getUtf8Length((char*)tempstr.c_str());
		if(pLabel->getContentSize().width>=width&&tplen>0)
		{
			if(flag1==1)
			{
				flag=flag1=0;
				slen=slen-curlen;
				for(int i=1;i<curlen;++i)
				{
					slen+=1;
					tempstr=subUtfString(srcstr.c_str(),offset,offset+slen);
					pLabel->setString(tempstr.c_str());
					if(pLabel->getContentSize().width>width)
					{
						slen-=1;
						break;
					}
				}
				tempstr=subUtfString(srcstr.c_str(),offset+slen);
				rs.append(tempstr);
				rs.append("\n");
				offset+=slen;
				tempstr=subUtfString(srcstr.c_str(),-1);
				pLabel->setString(tempstr.c_str());
				continue;
			}
			curlen=getUtf8Length((char*)tempstr.c_str())/2;
			tempstr=subUtfString(srcstr.c_str(),offset+curlen);
			pLabel->setString(tempstr.c_str());
			flag=1;
			continue;
		}
		if(pLabel->getContentSize().width<width&&tplen>0&&flag==1)
		{
			if(curlen<=1)
				curlen=1;
			else
				curlen=curlen/2;
			slen=tplen+curlen;
			tempstr=subUtfString(srcstr.c_str(),offset+slen);
			pLabel->setString(tempstr.c_str());
			flag1=1;
			continue;
		}
		if(pLabel->getContentSize().width<width&&tplen>0)
		{
			tempstr=subUtfString(srcstr.c_str(),-1);
			rs.append(tempstr);
			break;
		}
	}
	pLabel->setString(rs.c_str());
	pLabel->setAnchorPoint(CCPointZero);
	pLabel->setHorizontalAlignment(kCCTextAlignmentLeft);
	return pLabel;
}
CCScale9Sprite* Guide::CreateTextSprite(char *text,float width)
{
	CCTexture2D *tx=m_rc->getSprite()->getTexture();
	CCSize sz=tx->getContentSize();
	//CCScale9Sprite* sp = CCScale9Sprite::createWithSpriteFrame(
	//	CCSpriteFrame::createWithTexture(tx,CCRect(0,sz.width,sz.height)));
	char bkname[32]="guide/22.png";
	if(width>=960)
		strcpy(bkname,"guide/222.png");
	CCScale9Sprite* sp = CCScale9Sprite::create(bkname);
	sp->setAnchorPoint(ccp(0,0));
	if(width<960)
	  sp->setopacity(200);
	sp->setInsetBottom(9);
	sp->setInsetRight(9);
	sp->setInsetTop(9);
	sp->setInsetLeft(9);
	CCSize bksize=sp->getContentSize(); 
	if(width==0)
	{
		width=bksize.width;
	}


	cclabelTTF* pLabel=GetFitLabel(text,width);	

	CCSize extenSize = CCSizeMake(pLabel->getContentSize().width+20,pLabel->getContentSize().height+20);
	sp->setContentSize(extenSize);
	sp->addChild(pLabel,10);
	pLabel->setPosition(ccpAdd(sp->getPosition(),ccp(10,10)));
	return sp;
}
void Guide::draw()
{
	cclayer::draw();
	onDraw();
	if(curlen<sumlen)
	{
		curlen+=0.2;
		char *sub = subUtfString(talkstr.c_str(),curlen);
		m_talk->setString(sub);
	}
}
void Guide::update(float delta)
{
	cd+=delta;
	if(cd>3)
	{
		 
		unscheduleUpdate();
		 
	}
}
void Guide::onDraw()
{   
	return ;


	CCDirector* director = CCDirector::sharedDirector();
	CCSize sz=director->getWinSize();

	CCSize psz=texture2d->getContentSize();
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);

	float w1=psz.width,h1=psz.height,w=sz.width,h=sz.height;
	pg->use();
	pg->setUniformsForBuiltins();
	GLint _positionLocation = glGetAttribLocation(pg->getProgram(),"a_position");
	GLint _colorLocation = glGetAttribLocation(pg->getProgram(),"a_color");
	GLint _textureLocation = glGetAttribLocation(pg->getProgram(),"a_texCoord");
	GLint _textureUniform = glGetUniformlocation(pg->getProgram(),"CC_Texture0");
	GLint tval = glGetUniformlocation(pg->getProgram(),"tval");
	gluniform1f(tval,transval);
	float tx=gx-w1/2,ty=gy-w1/2;
	tx-=tscalex;ty-=tscaley; w1+=tscalex*2; h1+=tscaley*2; 
	float tw=w1,th=h1;
	Vertex ttt1[] = {
		// Front
		{{0,{-tx/tw,1+ty/th}},{{w,{1+(w-w1-tx)/tw,{{0,h,-(h-ty-h1)/th}},-(h-ty-h1)/th}}
	};
	glBindBuffer(GL_ARRAY_BUFFER,sizeof(ttt1),ttt1,GL_STATIC_DRAW);
	glEnabLevertexAttribArray(_positionLocation);
	glEnabLevertexAttribArray(_colorLocation);
	glEnabLevertexAttribArray(_textureLocation);

	glVertexAttribPointer(_positionLocation,Color));
	glVertexAttribPointer(_textureLocation,TexCoord));
	////set sampler
	ccGLBindTexture2DN(0,texture2d->getName());
	gluniform1i(_textureUniform,0); // unnecc in practice

	glEnable(GL_LINE_SMOOTH);  
	glHint(GL_LINE_SMOOTH,GL_NICEST);  
	//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_BORDER);
	//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_BORDER);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	float clr[]={0,0};
	//glTexParameterfv( GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR,clr);   
	glDrawArrays(GL_TRIANGLE_STRIP,4);

	gldisable(GL_DEPTH_TEST);
	glBindBuffer(GL_ARRAY_BUFFER,0);
}
void Guide::delayjoin1(float dt)
{
	std::map<Rect,CCCallFuncND*>::iterator it;
	for(it=m_monitor.begin();it!=m_monitor.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	m_monitor.clear();
	for(it=m_strike.begin();it!=m_strike.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	m_strike.clear();
	m_monitor.insert(m_premonitor.begin(),m_premonitor.end());
	m_premonitor.clear();
}
void Guide::delayjoin2(float dt)
{
	std::map<Rect,CCCallFuncND*>::iterator it;
	for(it=m_monitor.begin();it!=m_monitor.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	m_monitor.clear();
	for(it=m_strike.begin();it!=m_strike.end();++it)
	{
		if(it->second->isSingleReference())
			it->second->release();
	}
	m_strike.clear();
	m_strike.insert(m_prestrike.begin(),m_prestrike.end());
	m_prestrike.clear();
}
void Guide::AddMonitor(Rect rc,CCCallFuncND* cn)
{
	if(cn)
	cn->retain();
	m_premonitor[rc]=cn;
	scheduleOnce(schedule_selector(Guide::delayjoin1),0.1);
}
void Guide::AddPierce(Rect rc,CCCallFuncND* cn)
{
	if(cn)
	cn->retain();
	m_prestrike[rc]=cn;
	scheduleOnce(schedule_selector(Guide::delayjoin2),0.1);
}
char* Guide::AlignTxt(char* text,float width)
{
	static char str1[256];
	memset(str1,256);
	std::string str;
	cclabelTTF* pLabel1 = cclabelTTF::create(text,24);
	cclabelTTF* pLabel2 = cclabelTTF::create(" ",24);
	float  wd1=pLabel1->getContentSize().width;
	float  wd2=pLabel2->getContentSize().width;
	int sct=(width-wd1)/wd2;

	str+="\n";
	for(int i=0;i<sct/2;++i)
	{
		str+=" ";
	}
	str+=text;
	for(int i=0;i<sct/2+4;++i)
	{
		str+=" ";
	}
	strcpy(str1,str.c_str());
	return str1;
}
bool Guide::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent)
{
	if(isVisible()==false)
		return true;
	if(cd<m_precd)
		return true;
	std::map<Rect,CCCallFuncND*>::iterator pit;
	for(pit=m_strike.begin();pit!=m_strike.end();++pit)
	{
		if(pit->first.containsPoint(pTouch->getLocation()))
		{
			if(pit->second)
			{
				pit->second->setTarget(this);
				pit->second->execute();
			}
			return false;
		}
	}
	std::map<Rect,CCCallFuncND*>::iterator it;
	for(it=m_monitor.begin();it!=m_monitor.end();++it)
	{
		if(it->first.containsPoint(pTouch->getLocation()))
		{
			if(it->second)
			{
				it->second->setTarget(this);
				it->second->execute();
			}
			return true;
		}
	}
	if(m_src.containsPoint(pTouch->getLocation()))
	{
		if(bsrcclick)
		{
			removeFromParentAndCleanup(true);
			return false;
		}
	}
	return true;
}
void Guide::ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent){}
void Guide::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent)
{

}
void Guide::ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent){}
void Guide::SetFocus(float x,bool flag,int type,CCTexture2D* tex)
{
	gx=x;
	gy=y;
	m_width=width;
	m_height=height;
	m_type=type;
	bsrcclick=flag;
	m_src=CCRect(gx-m_width/2,gy-height/2,m_height);
	switch (type)
	{
	case 0:
		texture2d=m_circle->getSprite()->getTexture();
		break;
	case 1:
		texture2d=m_rc->getSprite()->getTexture();
		break;
	case 2:
		texture2d=tex;
		break;
	}
	CCSize sz=texture2d->getContentSize();
	tscalex=(m_width-sz.width)/2;
	tscaley=(m_height-sz.height)/2;
}
CCNode* Guide::CreateLabel(char* text,float width)
{
	CCNode* plabel=CreateTextSprite(text,width);
	plabel->setPosition(x,y);
	addChild(plabel);
	return plabel;
}
CCNode* Guide::CreateArrow(float x,float angle)
{
	//CCSprite *spr=CCSprite::createWithTexture(m_arrow->getSprite()->getTexture());
	CCSprite *spr=CCSprite::create("guide/11.png");
	spr->setPosition(ccp(x,y));
	spr->setRotation(angle);
	addChild(spr,10);
	return spr;
}
void Guide::onEnter()
{
	cclayer::onEnter();
	this->setTouchEnabled(true);
	CCDirector::sharedDirector()->getTouchdispatcher()->addTargetedDelegate(this,-1000000,true);
}
void Guide::SetTransparent(float val)
{
	transval=val;
}
void Guide::reset()
{
	if(vertexBuffer==0)
		glGenBuffers( 1,&vertexBuffer );
	if(indexBuffer==0)
		glGenBuffers( 1,&indexBuffer );
	if(pg==0)
	{
		pg=new CCGLProgram();
		pg->initWithVertexShaderByteArray(shader_vert,shader_frag);
		pg->link();
		pg->updateUniforms();
	}
	if(m_circle==0)
	{
		m_circle=CCRenderTexture::create(400,400);
		m_circle->begin();
		drawcircle();
		m_circle->end(); 
		m_circle->retain();
		m_circle->getSprite()->getTexture()->setAntiAliasTexParameters();
	}

	if(m_arrow==0)
	{
		m_arrow=CCRenderTexture::create(100,100);
		m_arrow->begin();
		drawarrow();
		m_arrow->end(); 
		m_arrow->retain();
		m_arrow->getSprite()->getTexture()->setAntiAliasTexParameters();
	}

	if(m_rc==0)
	{
		m_rc=CCRenderTexture::create(400,400);
		m_rc->begin();
		drawrc();
		m_rc->end(); 
		m_rc->retain();
		m_rc->getSprite()->getTexture()->setAntiAliasTexParameters();
	}
}
void Guide::sreset()
{
	if(pg)
	{
		pg->reset();
		pg->initWithVertexShaderByteArray(shader_vert,shader_frag);
		pg->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);
		pg->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);
		pg->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);
		pg->link();
		pg->updateUniforms();
	}
}
void Guide::createHand(int dir,CCPoint pt)
{
	CCPoint temp;
	if(dir==0)//左边
	{
		temp.x=200;  temp.y=270;
		if(pt.x!=-1) temp=pt;
		CCSprite* spr=CCSprite::create("circle.png");
		CCSprite* spr1=CCSprite::create("thumb1.png");
		spr->runAction(CCRepeatForever::create(CCSequence::create(CCScaleto::create(0.6,1.5),CCScaleto::create(0.6,1.0),0)));
		spr->setPosition(ccp(temp.x,temp.y));
		spr1->setFlipX(true);
		spr1->setPosition(ccp(temp.x-30,temp.y-45));
		spr1->runAction(CCRepeatForever::create(CCSequence::create(CCMoveBy::create(0.6,ccp(15,15)),CCMoveBy::create(0.6,ccp(-15,-15)),0)));
		addChild(spr,10);
		addChild(spr1,10);
	}
	else if(dir==1)//右边
	{
		temp.x=800;  temp.y=270;
		if(pt.x!=-1) temp=pt;
		CCSprite* spr=CCSprite::create("circle.png");
		CCSprite* spr1=CCSprite::create("thumb1.png");
		spr->runAction(CCRepeatForever::create(CCSequence::create(CCScaleto::create(0.6,temp.y));
		spr1->setPosition(ccp(temp.x+30,10);
	}
}
void Guide::createTutor(char *txt,bool ani)
{
	CCSprite* spr1=CCSprite::create("guide/tutor.png");
	spr1->setPosition(ccp(465,90));
	addChild(spr1);
	
	m_talk=GetFitLabel(txt,960-180);
	curlen=sumlen=getUtf8Length((char*)m_talk->getString());
	if(ani)
	{
		curlen=1;
	}
	talkstr=m_talk->getString();
	char *sub = subUtfString(talkstr.c_str(),curlen);
	m_talk->setString(sub);
	m_talk->setAnchorPoint(ccp(0,1));
	m_talk->setPosition(ccp(330,150));
	addChild(m_talk);
}
int Guide::param=0;
Guide* Guide::gthis=0;
bool Guide::init()
{  


	cclog("------------------------ Guide::init()----------------------");
	gthis=this;
	cd=0;
	m_precd=0.2;
	gx=0;
	gy=0;
	m_width=0;
	m_height=0;
	scheduleUpdate();
	transval=0.6;
	if(vertexBuffer==0)
	glGenBuffers( 1,&vertexBuffer );
	if(indexBuffer==0)
	glGenBuffers( 1,400);
		m_circle->begin();
		drawcircle();
		m_circle->end(); 
		m_circle->retain();
		m_circle->getSprite()->getTexture()->setAntiAliasTexParameters();
	}
	
	if(m_arrow==0)
	{
		m_arrow=CCRenderTexture::create(100,100);
		m_arrow->begin();
		drawarrow();
		m_arrow->end(); 
		m_arrow->retain();
		m_arrow->getSprite()->getTexture()->setAntiAliasTexParameters();
	}
	
	if(m_rc==0)
	{
		m_rc=CCRenderTexture::create(400,400);
		m_rc->begin();
		drawrc();
		m_rc->end(); 
		m_rc->retain();
		m_rc->getSprite()->getTexture()->setAntiAliasTexParameters();
	}
	
	texture2d =m_circle->getSprite()->getTexture();
	return true;
}

cocos2dx新手引导类封装的更多相关文章

  1. ios8 – iOS 8上的ptrace

    我试图在ptrace上调用一个像thisptrace一样的函数;但是当我尝试使用#include导入它时,Xcode会给我一个错误’sys/ptrace.h’文件找不到.我错过了什么,我是否需要导入一个库,或者这在iOS上根本不可用?

  2. 在编译时编译Xcode中的C类错误:stl vector

    我有一个C类,用gcc和可视化工作室中的寡妇在linux上编译.boid.h:并在boid.cpp中:但是,当我在Xcode中编译此代码时,我收到以下错误:有任何想法吗?我以为你可以使用C/C++代码并在Xcode中编译没有问题?.m文件被视为具有Objective-C扩展名的.c文件..mm文件被视为具有Objective-C扩展名的.cpp文件,那么它被称为Objective-C只需将.m文件重命名为.mm,右键单击或按住Ctrl键并在Xcode中的文件中选择重命名.

  3. 如何从Haxe创建iOS-和OSX-库并在本机应用程序中使用它?

    我有一个在Haxe上编写自己的协议,数据结构和逻辑的跨平台实现.如何在iOS和OSX的企业应用程序中构建和使用它?

  4. Swift调用C语言自建函数库的方法

    本程序示范了如何用Swift调用自定义C语言模块的方法。简介示范程序中有一个C语言的源程序CSwift.C和一个头文件CSwift.h,我们的目标是构造一个CSwift的函数库,能够让swift源程序执行CSwift程序中的函数。快速上手本程序需要Swift3.0以上版本。下载、编译和测试源程序采用C语言写成,测试程序则是Swift语言编写。因此如果通过测试,则恭喜您,已经成功实现了Swift语言调用C语言的整个过程。这种做法主要是为了能够在同一个项目中用Swift去测试C语言的模块。

  5. 在Swift Xcode项目中使用LLVM C API

    我试图在用Swift编写的Xcode项目中使用LLVMCAPI.为此,我松散地遵循指南here,但遇到了麻烦.在编译步骤中,在Xcode中添加包含路径到构建设置后,我收到以下错误:幻灯片的下一步是添加标志:但我不确定在构建设置中将它们放在哪里–将它们添加到’其他C标志’或’其他Swift标志’选项似乎没有做任何事情.我该怎么做呢?

  6. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  7. android – UnsatisfiedLInkError使用NDK链接到FFMPEG

    我使用bambuser的文件编译了FFMPEGforandroid.编译运行正常.没有错误.我还确保在build.sh中更改包名称.但是,一旦我尝试链接到文件,手机就会抛出UnsatisfiedLinkError.这是Androkd.mk文件:Video.c很简单:相应的Java代码也很简单:但我得到这个错误:我尝试用Java手动加载预构建的共享库(bambuser文件)(使用System.loa

  8. 如何在android.mk文件中指定c头文件

    我有一个ac源文件夹名称“clib”,在那里,我有一些示例文件,如1.h,1.c,2.h,2.c,3.c,3.h和外面那个文件夹我有4.h,4.c,4_jni.h,4_jni.c现在构建“.so”我创建了我的android.mk这样的东西这里4.h包含1.h文件所以我真正的问题是,当我试图构建.so文件时,它给了我一个像这样的错误致命错误:1.h:没有这样的文件或目录如果我从4.h中移除1.h,一切都很好,但我有一个大的c库具有相同类型的文件夹结构,并且一些.h文件包含很少的marcos定义…

  9. android – layout“include”功能不支持layout_gravity属性?

    似乎layout_margin也不支持.这是view1.xml布局解决方法两年后,这个bug仍然存在!尽管标签应该支持所有android:layout_*属性,但android:layout_gravity属性不是.我目前使用的工作是以编程方式设置布局边距,如下所示:或者作为父级的FrameLayout,例如:编辑:我还发现android:layout_gravity属性适用于include标签,因为它有layout_width和layout_height标签!

  10. android-studio – 无法使用Android Studio从JNI打印日志消息

    我得到的错误:error:undefinedreferenceto‘__android_log_print’我已将此行添加到我的.cpp文件中:我尝试过两种方法:__android_log_print和__android_log_write我还在我的Android.mk文件(我手动编译)中链接了日志库.LOCAL_LDLIBS:=–llog我也尝试了几种我认为的替代品:这是我的Android.mk

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部