cocos2d-x触摸事件优先级的探究与实践
如何让自定义Layer触发触摸事件?
bool LayerXXX::init() { this->setTouchEnabled(true); CCTouchDispatcher* td = CCDirector::sharedDirector()->getTouchDispatcher(); td->addTargetedDelegate(this,true); //kCCMenuHandlerPriority - 10 // ... } CTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类, CCTouchDispatcher中包含了两个CCTouchHandler的列表,
//------------------------------- //Touch1 100 //Touch2 100 Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,128),100,100 ); this->addChild( touch1layer ); touch1layer->setPosition(200,100); Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,255,100 ); this->addChild( touch2layer ); touch2layer->setPosition(250,100); //结果: //Touch2 //Touch1 //------------------------------- //Touch1 100 //Touch2 100 Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,100); Touch1Layer* touch1layer = Touch1Layer::create( ccc4f(255,100); 结果: Touch1 Touch2 ------------------------------- Touch1 100 Touch2 99 Touch2Layer* touch2layer = Touch2Layer::create( ccc4f(255,100); //结果: //Touch2 //Touch1 //说明优先级越小越先触发事件 //------------------------------- 如何阻塞事件的向后传递? 如何阻塞事件的向后传递? 主要是利用了TargetedTouchDelegate 的一个叫SwallowTouch的参数 ,如果这个开关打开的话, 比他权限低的handler 是收不到 触摸响应的,这里的权限低的意思是先看priority(priority越低的优先级越高)再看哪个Layer最后addChild进去(越后添加的优先级越高)。 CCMenu 就是开了Swallow 并且权限为-128(权限是越小越好),所以CCMenu的事件不会出现击穿 mSwallowsTouches = true 并且 ccTouchBegan 返回 true void Touch1Layer::setFocus() { // 将zorder=1; priority= kCCMenuTouchPriority - 2; // 设置zorder SceneController::GetInstancePtr()->getCurLayer()->reorderChild(this,1); // 设置优先级 CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - 2,this); } void Touch1Layer::loseAllFocus() { // 获取顶层的所有节点 CCArray* arrChilds = SceneController::GetInstancePtr()->getCurLayer()->getChildren(); for(int i=0; i< arrChilds->count(); i++) { CCLayerColor* layer = dynamic_cast< CCLayerColor* >( arrChilds->objectAtIndex(i) ); // 跳过自己(不撤销自己的优先级) if(layer != NULL && layer != this) { // 将zorder=0; priority= kCCMenuTouchPriority - 1; SceneController::GetInstancePtr()->getCurLayer()->reorderChild(layer,0); CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority - 1,layer); } } } 如何判断点在矩形内部?
CCPoint pos = this->getPosition(); CCSize size = this->getContentSize(); CCRect rect(pos.x,pos.y,size.width,size.height); if( CCRect::CCRectContainsPoint(rect,point) ) { } z值大的成员在z值小的成员的上面; @warning: Use it at your own risk since it might break the cocos2d parent-children z order (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- reactjs – 大型创建 – 反应 – 应用程序包大小 – 优化生
- $.getJSON的用法
- 在iPhone上调试时,NSLog会输出unicode字符作为垃圾
- swift 对日期的处理大全( 类扩展 Date+Extension 和 公共类
- Vue中使用插槽(slot)、聚类插槽详解
- c# – “无法在Azure Web应用程序中创建SSL / TLS安全通道”
- ruby-on-rails – Rails 3.获取Errno :: EACCES权限在生产中
- ios – WatchOS 2:“无法安装手表应用程序”“启动”TestA
- ruby-on-rails – 可用的Rails http标头列表(如“:success
- c# – 当TabControl的ItemsSource绑定到WPF中的列表时,如何