在需要对某些图片的不规则点击区域响应事件
思路是遍历图片上的点.如果是透明区域就不响应事件
过程是在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); tmp->visit(); //glubyte pcolor[4]; //glreadPixels(nsp.x,nsp.y,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 >getcolorAtPos</span><span >(float x,float y)</span> { color4B color = { 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.求大神解答 总结
以上是内存溢出为你收集整理的cocos2dx不响应透明区域事件全部内容,希望文章能够帮你解决cocos2dx不响应透明区域事件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)