cocos2dx3.0的触摸优先级和触摸屏蔽问题

本文介绍如何在 Cocos2d-x 中使用触摸事件监听器,并通过示例代码展示了如何设置触摸事件的优先级及绑定,确保特定元素能够捕获触摸事件。

用一个实战的例子吧

先贴代码

	auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听  
	listener1->setSwallowTouches(true);//设置不想向下传递触摸  true是不想 默认为false
	
	listener1->onTouchBegan = [](Touch* touch, Event* event){ 
		CCLOG("touch menu");
		return true; 
	};  
	listener1->onTouchMoved = [](Touch* touch, Event* event){    
	};  
  
	listener1->onTouchEnded = [=](Touch* touch, Event* event){  
	};  
	
	Size visibleSize = Director::getInstance()->getVisibleSize();
    	Point origin = Director::getInstance()->getVisibleOrigin();
	//这里添加了一个MenuItem 用来对比触摸优先级
	auto continueItem = MenuItemImage::create(
                                           "ContinueNormal.png",
                                           "ContinueSelect.png",
                                           CC_CALLBACK_1(MenuLayer::menuContinueCallback, this));
	
	continueItem->setPosition(Point(origin.x + visibleSize.width/2  ,
		origin.y + visibleSize.height/2+continueItem->getContentSize().height));


	// 这里添加了一个背景,下面会用到
    	auto background = Sprite::create("background.png");
	background->setTextureRect(CCRectMake(0, 0, visibleSize.width, visibleSize.height));
	background->setContentSize(visibleSize);
    	background->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    	this->addChild(background, 0);

    	auto menu = Menu::create(continueItem, NULL);
    	menu->setPosition(Point::ZERO);
    	this->addChild(menu, 1);
	_eventDispatcher->addEventListenerWithFixedPriority(listener1,-128); // 重点就是这两行,下面会有详解
	//_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,background);


上面那段代码其实也有很多注释了,关于触摸屏蔽主要实现3个地方

listener1->setSwallowTouches(true);//设置禁止想下传递触摸  
//以下两段代码二选一
//第一段是可以自由设置触摸优先级
//但是不绑定任何东西
_eventDispatcher->addEventListenerWithFixedPriority(listener1,-128);
	
//这一段是设置触摸绑定到精灵,优先级为默认的0
//_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,background);


当然 既想设置绑定到精灵,又想设置优先级,我们可以这样

auto dispatcher = Director::getInstance()->getEventDispatcher();  
dispatcher->addEventListenerWithSceneGraphPriority(listener1,this); //这是绑定到当前精灵
dispatcher->setPriority(listener1,1)



还有一点值得注意的是,触摸优先级越低的越先被触摸。相同优先级的,后添加的先被触摸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值