用了一段时间的Cocos2d-3.x,遇到一个问题,就是判断触摸的精灵像素是否有效,而cocos并没有获取Sprite某一点像素值的方法。
在网上看到有人通过保存Image像素的方法,来记录像素值。或者通过Image::initWithImagefile 来实现获取像素值。
前者浪费内存,后者浪费性能。今天来分享一下我的实现方法
/** * 判断Sprite某点像素值是否有效 * @author devefx * @date 2016/8/13 */bool isNonInvalIDPixel(Sprite* sprite,const Point& point){ Rect rect = sprite->getBoundingBox(); if (rect.containsPoint(point)) { Glint oldFBO; glGetIntegerv(GL_FRAMEBUFFER_BINDING,&oldFBO); gluint frameBuffer; glGenFramebuffers(1,&frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer); glFramebufferTexture2D(GL_FRAMEBUFFER,GL_color_ATTACHMENT0,GL_TEXTURE_2D,sprite->getTexture()->getname(),0); CCASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE,"Could not attach texture to framebuffer"); Rect frameRect = sprite->getSpriteFrame()->getRectInPixels(); // subtract anchor point Glint x = point.x - rect.getMinX(); Glint y = point.y - rect.getMinY(); // convert left-handed y = frameRect.size.height - 1 - y; // add frame origin x = x + frameRect.origin.x; y = y + frameRect.origin.y; color4B color; glPixelStorei(GL_PACK_AlignmENT,1); glreadPixels(x,y,1,GL_RGBA,GL_UNSIGNED_BYTE,&color); glBindFramebuffer(GL_FRAMEBUFFER,oldFBO); glDeleteFramebuffers(1,&frameBuffer); return color.a != 0; } return false;}
主要是使用FBO关联已经加载的texture,再通过glreadPixels来获取像素值
总结以上是内存溢出为你收集整理的cocos2d判断精灵某点颜色是否有效全部内容,希望文章能够帮你解决cocos2d判断精灵某点颜色是否有效所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)