Cocos2d-x 3.x开发 叠加触摸的问题

    叠加触摸就是说两个触摸层叠加一起, 点击上边的层,则下边也会被点中.这个问题困扰我有一个星期了,不过终于还是解决了,心情很通畅,写点笔记作参考.

void CtrolSprite::setTouchEnableds(bool var)
{
    if ( m_bTouchEnabled == var ) return;
    m_bTouchEnabled = var;
    if ( var )
    {
        auto dispather = Director::getInstance()->getEventDispatcher();
        lisner = EventListenerTouchOneByOne::create();
        lisner->setSwallowTouches( true );
        lisner->onTouchBegan = [&](cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
        {
            if ( !m_bTouchEnabled ) return true;
            if ( isTouchInside( pTouch ) )
            {
                m_bSelected = true;
                setColor( Color3B(150, 150, 150) );
                return true;  //返回真则吞噬低于此优先级的触摸层
            }
            return false;
        };
        lisner->onTouchMoved = [&](cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
        {
            if ( !m_bTouchEnabled || !m_bSelected ) return;
            if ( !isTouchInside(pTouch) ) m_bSelected = false;
        };
        lisner->onTouchEnded = [&](cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
        {
            setColor( Color3B(255, 255, 255) );
            if ( !m_bTouchEnabled || !m_bSelected ) return;
            if ( isTouchInside(pTouch) && isVisible() )
            {
                if ( m_pTarget && m_selector )
                {
                    (m_pTarget->*m_selector)(this);
                }
            }
            m_bSelected = false;
        };
        dispather->addEventListenerWithFixedPriority(lisner, m_iPriority); //设置优先级负数越高触摸越靠前, 如果设置固定优先级,那么必须手动移除.                                                //dispather->addEventListenerWithSceneGraphPriority(lisner, this); //这个是最前边的层越优先触摸.
    }else
    {
        auto dispather = Director::getInstance()->getEventDispatcher();
        dispather->removeEventListener( lisner );
    }
}

 看看吧.就这么简单.搞清楚原理就行


Rect CtrolSprite::getRect()
{
	float t_fX = getPositionX() - getContentSize().width * getAnchorPoint().x;
	float t_fY = getPositionY() - getContentSize().height * getAnchorPoint().y;
	float t_fW = getContentSize().width;
	float t_fH = getContentSize().height;
	Rect box = Rect(t_fX, t_fY, t_fW, t_fH);
	box.origin = Vec2::ZERO;
	return box;
}
不是很理解上边代码.  领悟中....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值