加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx不响应透明区域事件

发布时间:2020-12-14 19:38:21 所属栏目:百科 来源:网络整理
导读:在需要对某些图片的不规则点击区域响应事件 思路是遍历图片上的点.如果是透明区域就不响应事件 过程是在hitTest中做 可以写在基类中.如Node,我是写在Widget::Button中,并且没有完全完善,比如只做了buttonNormalRenderer的.大家可以根据思路用在其它地方. //.

在需要对某些图片的不规则点击区域响应事件

思路是遍历图片上的点.如果是透明区域就不响应事件

过程是在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 style="font-family: Arial,Helvetica,sans-serif;">getColorAtPos</span><span style="font-family: Arial,sans-serif;">(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.求大神解答

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读