因为想要实现把两个精灵用线连接起来的功能,就想到用Opengl 话直线,但是Opengl 直接画线会被CCLayer 遮挡,而且还不能设置Z轴坐标;于是上网查,但是查到的都是关于用OpenGL 画线的原理,而且没有贴图的效果;
于是自己就写了一个继承自CCSprite 的类LineSprite来实现,原理是通过线两端的两个点计算旋转角度和两个点的距离来对X轴缩放并进行旋转;从而达到在两个点之间绘制具有贴图的功能;先看效果:
线的两端是两个CCSprite;
直接来源码:
#include"cocos2d.h"
using namespace cocos2d;
class LineSprite :public CCSprite
{
private:
CCPoint tailPont;
CCSprite *tail;
CCSprite *head;
float angle;
float origionLength;
float p;//p表示π与角度转换的比例值
public:
LineSprite()
{
angle=0.f;
}
static LineSprite* create(char *filename)
{
LineSprite* instance=(LineSprite*)CCSprite::create(filename);
instance->Init();
return instance;
}
public:
void Init()
{
setAnchorPoint(ccp(0.0f,0.5f));
setAngle(0.0f);
setOrigionLength( getTexture()->getPixelsWide());
tail=NULL;
head=NULL;
}
private:
void setOrigionLength(float l)
{
origionLength=l;
}
void setAngle(float angle)
{
this->angle=angle;
}
public:
void setHeadPoint(CCPoint &p)
{
this->setPosition(p);
this->p=180/3.1415926f;
}
void setTailPoint(CCPoint &p)
{
tailPont.setPoint(p.x,p.y);
tail->setPosition(p);
head->setPosition(getPosition());
toLine();
}
void setHead(char*filename)
{
if(head!=NULL) return;
head=CCSprite::create(filename);
getParent()->addChild(head,4);
}
void setTail(char*filename)
{
if(tail!=NULL) return;
tail=CCSprite::create(filename);
getParent()->addChild(tail,4);
}
void setHead(CCSprite* sp)
{
head=sp;
getParent()->addChild(sp,m_nZOrder);
}
void setTail(CCSprite* sp)
{
tail=sp;
getParent()->addChild(sp,m_nZOrder);
}
private:
void toLine()
{
float x=tailPont.x-getPositionX();
float y=tailPont.y-getPositionY();
///计算两点距离
float length= sqrtf( x*x+y*y);
///长度缩放
this->setScaleX(length/origionLength);
angle=atanf(y/x);
if(x<0&&y>0)//如果在第二象限
setRotation(-180-angle*p);
else if(y<0&&x<0)//如果在地三象限
setRotation(180-angle*p);
else//如果在一、四象限
setRotation(-angle*p);
}
};
但是我自己在实现的时候不知道为什么在使用静态方法创建LineSprite后不能再继续创建其他的结点,而且在程序关闭的时候会报错 提示程序对内存溢出错误
还有资源贴图