因为要这么一个橡皮擦的功能,原想往上找个现成的,结果吧,找了有近半个小时,没有啊,哎。各种群里问啊喊啊,没反应,得,自己搞吧。。。。这就出来了,分享一下吧,本人的第一篇技术贴。。。。
原理:opengl alpha混合
首先,需要一张底图,一张蒙版图。底图直接加载到当前layer。
其次,要搞个数组,记录一下触摸的轨迹,比较简单,就不说了。
蒙版图要跟底图分开并且在上层,触摸时擦掉蒙版,显示出底图。这里需要用到CCRenderTexture,。。。还是直接代码吧
void MoveOrbit::init(int width,int height,const CCPoint& aPoint,const char* pFileName)
{
index = 0;
m_checkNum = 0;
m_renderW = width;
m_renderH = height;
CCSize s = CCDirector::sharedDirector()->getWinSize();
this->setIsTouchEnabled(true);
for(int i= 0; i < pt_count; ++ i)
{
path[i] = ccp(0,0);
}
m_target = CCRenderTexture::renderTextureWithWidthAndHeight(m_renderW,m_renderH);
if (NULL == m_target)
{
return;
}
m_target->setPosition(aPoint);
m_points[0] = ccp(m_renderW / 2,m_renderH / 2);
m_points[1] = ccp(m_renderW / 4,m_renderH / 4);
m_points[2] = ccp(m_renderW / 4,m_renderH * 3 / 4);
m_points[3] = ccp(m_renderW * 3 / 4,m_renderH / 4);
m_points[4] = ccp(m_renderW * 3 / 4,m_renderH * 3 / 4);
m_sprite = CCSprite::spriteWithFile(pFileName);
m_sprite->setPosition(ccp(0,0));
m_sprite->retain();
addChild(m_target,1);
}
void MoveOrbit::draw()
{
m_target->begin();
m_sprite->draw();
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
//===========================
glColor4f(0,0,0,0);
glBlendFunc(GL_SRC_ALPHA,GL_ZERO);
glPointSize((GLfloat)KDis);
ccDrawPoints(path,index);
//==============================
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBlendFunc( CC_BLEND_SRC, CC_BLEND_DST);
glColor4f(0,0,0,1);
m_target->end(false);
}
MoveOrbit* orbit = MoveOrbit::creat(300,200,ccp(size.width / 2,size.height / 4),"HelloWorld.png");
orbit->setObserver(this);
addChild(orbit,100);
CCSprite* sprite = CCSprite::spriteWithFile("test/dgg1.png");
sprite->setPosition(ccp(size.width / 2, size.height / 2));
addChild(sprite);
就这样吧,差不多核心代码就这些了,第一次发文,也不知道说点啥。。。。有问题QQ联系:277749000 子夜