新开发的游戏主城内建筑比较多、间距小,使用touch优先级判断不够准确,所以找了一个可以判断非透明区域点击的方法。
先前测试发现,G7机器上面有闪烁问题(黑一下,可能是GPU不够好),后来为了解决手机发热问题,将fps调整到30,次问题也消失了(巧合,本来打算使用控制刷新区域来解决的)。
bool isTouchInTexture(CCNode* pNode, CCTouch* touch)
{
unsigned char data[4];
//获得点击的OpenGL的世界坐标值
CCPoint touchPoint = pNode->convertTouchToNodeSpace(touch);
CCPoint location = ccp((touchPoint.x) * CC_CONTENT_SCALE_FACTOR(), (touchPoint.y) * CC_CONTENT_SCALE_FACTOR());
CCRenderTexture* renderTexture = CCRenderTexture::create(1* CC_CONTENT_SCALE_FACTOR(),1 * CC_CONTENT_SCALE_FACTOR(), kCCTexture2DPixelFormat_RGBA8888);
//只保存渲染一个像素的数据
CCPoint oldPos = pNode->getPosition();
CCPoint oldAnchor = pNode->getAnchorPoint();
pNode->setAnchorPoint(ccp(0,0));
pNode->setPosition(ccp(-location.x, -location.y));
renderTexture->beginWithClear(0,0,0,0);
pNode->visit();
glReadPixels(0,0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
renderTexture->end();
pNode->setAnchorPoint(oldAnchor);
pNode->setPosition(oldPos);
//检测alpha值
if(data[0] || data[1] || data[2] || data[3])
{
//非透明
return true;
}
return false;
}