像素级触摸的意义:
可以判断触摸点的RGBA值,根据A值可以判断触摸的位置是否为透明区域,这样就可以判断不规则区域的点击了。
像素级触摸的实现:
例如我们在程序init的时候,添加了一个图片在layer中,想要判断触摸的位置的像素以及透明度
bool HelloWorld::init()
{
CCSize gWinsize = CCDirector::sharedDirector()->getWinSize();
m_sprite = CCSprite::create("adt.png");
m_sprite->setPosition(ccp(gWinsize.width/2,gWinsize.height/2));
this->addChild(m_sprite);
this->setTouchEnabled(true);
return true;
}
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
//判断点击区域是否在所添加的图片之中
CCPoint pos = pTouch->getLocation();
if (m_sprite->boundingBox().containsPoint(pos))
{
ccColor4B c = {0, 0, 0, 0};
//将点击的位置转化为图片下的坐标,用于判断像素点的位置
m_pos = m_sprite->convertTouchToNodeSpace(pTouch);
//CCLog("m_pos is %f,%f",m_pos.x,m_pos.y);
//这句是关键,为了获取点击的位置所在图片中的像素点,y需要做一个相减的操作。好像是因为画布画出来的是Y轴翻转后的,测试确实应该相减,但是将画布添加的layer中,发现没有翻转,这点不太明白。
unsigned int x = m_pos.x, y = m_sprite->getContentSize().height - m_pos.y;
//按照图片的大小新建画布,默认锚点0,0.默认坐标屏幕左下角
CCRenderTexture* texture = CCRenderTexture::create(m_sprite->getContentSize().width, m_sprite->getContentSize().height, kCCTexture2DPixelFormat_RGBA8888);
//使用图片新建纹理,并且设置其位置,使之与画布重合,这样才能画出来完整的图片
CCSprite* spriteTmp = CCSprite::createWithTexture(m_sprite->getTexture());
spriteTmp->setPosition(ccp(spriteTmp->getContentSize().width/2,spriteTmp->getContentSize().height/2));
//开始画
texture->begin();
spriteTmp->visit();
texture->end();
//将画布中的内容取出
CCImage* im = texture->newCCImage();
//获得了第一个像素点
unsigned char * data = im->getData();
//获得点击位置的像素点
unsigned int * pixel = (unsigned int*)data;
pixel = pixel + (y * (int)m_sprite->getContentSize().width) + x;
//取出的即为RGBA
c.r = *pixel & 0xff;
c.g = (*pixel >> 8) & 0xff;
c.b = (*pixel >> 16) & 0xff;
c.a = (*pixel >> 24) & 0xff;
CCLog("%d,%d,%d,%d",c.r,c.g,c.b,c.a);
}
return true;
}