参考了很多资料,理都懂,然并卵啊!
第一个想到的是用RenderTexture来实现判断点击的像素点的alpha值,参考的资料 http://blog.csdn.net/lwuit/article/details/40658347 发现不成功,貌似渲染机制改了有点蛋疼。
第二个参考的就是 http://blog.csdn.net/super_level/article/details/41708563的方法,然后在修改了下成功了,上代码。
首先是在widget中添加:
virtual bool AlphaTouchCheck(const Vec2 &point);
virtual bool getAlphaTouchEnable();
virtual void setAlphaTouchEnable(bool isAlphaTouch);
bool Widget::AlphaTouchCheck(const Vec2 &point)
{
return true;
}
bool Widget::getAlphaTouchEnable()
{
return _isAlphaTouchEnable;
}
void Widget::setAlphaTouchEnable(bool isAlphaTouch)
{
_isAlphaTouchEnable = isAlphaTouch;
}
widget中的判断先默认返回true
把开启的开关放在widget中,方便以后layout 和 imageview的不规则点击。开关默认关闭
接下来就是uibutton中重载AlphaTouchCheck 函数
bool Button::AlphaTouchCheck(const Vec2& point)
{
if (getAlphaTouchEnable())
{
Image* normalImage = new Image();
normalImage->initWithImageFile(_normalImageString);
auto data = normalImage->getData();
if (data == NULL)
{
return true;
}
auto locationInNode = this->convertToNodeSpace(point);
//图片的0,0 是左上角 所以要和触摸点的Y转换一下 也就是“(normalImage->getHeight() - (int)(locationInNode.y) - 1)”
//该data值是把二维数组展开成一个一维数组, 因为每个像素值由RGBA组成, 所以每隔4个char为一个RGBA, 并且像素以横向排列
int pa = 4 * ((normalImage->getHeight() - (int)(locationInNode.y) - 1) * normalImage->getWidth() + (int)(locationInNode.x)) + 3;
unsigned int ap = data[pa];
if (ap < 20)
{
CC_SAFE_DELETE(normalImage);
return false;
}
else
{
CC_SAFE_DELETE(normalImage);
return true;
}
}
return true;
}
_normalImageString 是记录创建时候的图片名。
然后就ok了。