CCSprite点击非透明区域的判断,有时可以,有时不可以?

  • 本帖最后由 kcl_70 于 2013-3-22 14:19 编辑 *

//将点击点转换成自己坐标系中的坐标,相对于0,0点 CCPoint pt = convertTouchToNodeSpace(touch); int nw = getContentSize().width; int nh = getContentSize().height;
CCRect rc(0, 0, nw, nh); if(rc.containsPoint(pt)) { //获得点击的OpenGL的世界坐标值 CCPoint touchPoint = touch->getLocation(); //检测矩形区域 CCPoint location = ccp(touchPoint.x * CC_CONTENT_SCALE_FACTOR(), touchPoint.y * CC_CONTENT_SCALE_FACTOR());
UInt8 data;
CCRenderTexture* renderTexture = CCRenderTexture::create(this->boundingBox().size.width* CC_CONTENT_SCALE_FACTOR(), this->boundingBox().size.height * CC_CONTENT_SCALE_FACTOR(), kCCTexture2DPixelFormat_RGBA8888);
renderTexture->begin(); this->visit();
glReadPixels((GLint)location.x,(GLint)location.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
renderTexture->end(); renderTexture->release();
NSLog(@“X:.0f y:.0f R: %d, G: %d, B: %d, A: %d tag:%d”,location.x ,location.y, data, data, data, data,this->getTag());
if(data != 0 && data != 0 && data != 0 && data != 0) { this->setBlendFunc((ccBlendFunc) {GL_ONE, GL_ONE}); return true; } } return false;如题,怎么样可以精确的判断是否点击某一Sprite的透明区域

解决了是我CCRenderTexture* renderTexture = CCRenderTexture::create(this->boundingBox().size.width* CC_CONTENT_SCALE_FACTOR(), this->boundingBox().size.height * CC_CONTENT_SCALE_FACTOR(), kCCTexture2DPixelFormat_RGBA8888);大小出了问题,应该给屏幕分辨率大小的,不过发现这个判断像素的方法效率有点底,因为要截取屏幕的像素,瞬时占用内存较多,有更好的方法吗?

— Begin quote from ____

kcl_70 发表于 2013-3-22 16:54 url

解决了是我CCRenderTexture* renderTexture = CCRenderTexture::create(this->boundingBox().size.width* C …

— End quote

这个判断CCSprite点击区域是否透明的效率实在是很底,有没有更高效的方法可以判断一个动画中的CCSprite某像素点是否透明,跪求啊!!

— Begin quote from ____

kcl_70 发表于 2013-3-22 22:43 url

这个判断CCSprite点击区域是否透明的效率实在是很底,有没有更高效的方法可以判断一个动画中的CCSprite某 …

— End quote

经过一些资料于尝试现在修改如下,效率和内存占用都很不错
//获得点击的OpenGL的世界坐标值 CCPoint touchPoint = convertTouchToNodeSpace(touch); CCPoint location = ccp((touchPoint.x) * CC_CONTENT_SCALE_FACTOR(), (touchPoint.y) * CC_CONTENT_SCALE_FACTOR());
UInt8 data; CCRenderTexture* renderTexture = CCRenderTexture::create(1* CC_CONTENT_SCALE_FACTOR(),1 * CC_CONTENT_SCALE_FACTOR(), kCCTexture2DPixelFormat_RGBA8888); renderTexture->beginWithClear(0,0,0,0); //只保存渲染一个像素的数据 CCPoint oldPos = this->getPosition(); CCPoint oldAnchor = this->getAnchorPoint(); this->setAnchorPoint(ccp(0,0)); this->setPosition(ccp(-location.x, -location.y)); this->visit(); this->setAnchorPoint(oldAnchor); this->setPosition(oldPos); glReadPixels(0,0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); renderTexture->end(); renderTexture->release(); //检测alpha值 if(data || data || data || data) { //非透明 return true; } //透明 return false;

— Begin quote from ____

kcl_70 发表于 2013-3-22 22:43 url

这个判断CCSprite点击区域是否透明的效率实在是很底,有没有更高效的方法可以判断一个动画中的CCSprite某 …

— End quote

经过一些资料于尝试现在修改如下,效率和内存占用都很不错
//获得点击的OpenGL的世界坐标值 CCPoint touchPoint = convertTouchToNodeSpace(touch); CCPoint location = ccp((touchPoint.x) * CC_CONTENT_SCALE_FACTOR(), (touchPoint.y) * CC_CONTENT_SCALE_FACTOR());
UInt8 data; CCRenderTexture* renderTexture = CCRenderTexture::create(1* CC_CONTENT_SCALE_FACTOR(),1 * CC_CONTENT_SCALE_FACTOR(), kCCTexture2DPixelFormat_RGBA8888); renderTexture->beginWithClear(0,0,0,0); //只保存渲染一个像素的数据 CCPoint oldPos = this->getPosition(); CCPoint oldAnchor = this->getAnchorPoint(); this->setAnchorPoint(ccp(0,0)); this->setPosition(ccp(-location.x, -location.y)); this->visit(); this->setAnchorPoint(oldAnchor); this->setPosition(oldPos); glReadPixels(0,0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); renderTexture->end(); renderTexture->release(); //检测alpha值 if(data || data || data || data) { //非透明 return true; } //透明 return false;

楼主,还在吗?为什么这个代码我在3.1上不起作用,打印出的RGBA值都是-1

有知道的吗?请指示,谢谢

哎,这么冷清

有谁能给我回答一下吗?