在需要对某些图片的不规则点击区域响应事件
思路是遍历图片上的点.如果是透明区域就不响应事件
过程是在hitTest中做
可以写在基类中.如Node,我是写在Widget::Button中,并且没有完全完善,比如只做了buttonNormalRenderer的.大家可以根据思路用在其它地方.
//.h
//按钮可支持多边形,透明区域不击中
public:
void setSupportPolygonTouch(bool value){ _supportPolygon = value; }
protected:
bool _supportPolygon;
//.cpp
//add by jj
bool Button::hitTest(const Vec2 &pt)
{
if (!_supportPolygon || _scale9Enabled)
return Widget::hitTest(pt);
Vec2 nsp = this->convertToNodeSpace(pt);
Rect bb;
bb.size = _contentSize;
if (bb.containsPoint(nsp))
{
RenderTexture* render = RenderTexture::create(_buttonNormalRenderer->getContentSize().width, _buttonNormalRenderer->getContentSize().height, Texture2D::PixelFormat::RGBA8888);
Sprite *sprite = static_cast<Sprite*>(_buttonNormalRenderer);
Texture2D *texture = sprite->getTexture();
Sprite *tmp = Sprite::createWithTexture(texture, sprite->getTextureRect());
tmp->setVisible(true);
tmp->setAnchorPoint(Vec2::ZERO);
tmp->setPosition(Vec2::ZERO);
render->beginWithClear(0, 0, 0, 0);
tmp->visit();
//GLubyte pColor[4];
//glReadPixels(nsp.x, nsp.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pColor[0]);
render->end();
Director::getInstance()->getRenderer()->render();
Image *img = render->newImage(false);
Color4B color = img->getColorAtPos(nsp.x, nsp.y);
//render->saveToFile("test.png");
if (color.a || color.b || color.g)
return true;
}
return false;
}
//关键位置CCImage.h
Color4B <span style="font-family: Arial, Helvetica, sans-serif;">getColorAtPos</span><span style="font-family: Arial, Helvetica, sans-serif;">(float x, float y)</span>
{
Color4B color = { 0, 0, 0, 0 };
int ix = (int)x - 1;
int iy = (int)y - 1;
unsigned char *tmp = _data;
tmp += (iy*getWidth() + ix) * 4;
color.r = *(tmp++);
color.g = *(tmp++);
color.b = *(tmp++);
color.a = *(tmp++);
return color;
};
之前有考虑用glReadPixels.不知道为什么读出来的都是0.求大神解答