c 网站开发htnl,ppt免费下载的网站,厦门网直播,创意小设计产品遇到情况 #xff1a; 场景a -》层1-》层2 1、层一点击没有传递到场景a #xff08;
这个考虑到可能是场景调用的层 内部代码屏幕场景中的点击 如果层调用层就出现2情况了
#xff09; 2、但 层2点击会点击到层1 处理方式#xff1a; 为层创建全局触摸调用函数 to… 遇到情况 场景a -》层1-》层2 1、层一点击没有传递到场景a
这个考虑到可能是场景调用的层 内部代码屏幕场景中的点击 如果层调用层就出现2情况了 2、但 层2点击会点击到层1 处理方式 为层创建全局触摸调用函数 touchbegan 返回true 吞噬事件 继续调用touchmove等 .h bool onTouchBegan(Touch* touch, Event* event) ; void onTouchMoved(Touch* touch, Event* event); void onTouchEnded(Touch* touch, Event* event) ; .cpp EventListenerTouchOneByOne*touchListener EventListenerTouchOneByOne::create();//给scrollview所有sprite添加监听用 touchListener-onTouchBegan CC_CALLBACK_2(WjjnLayer::onTouchBegan, this); touchListener-onTouchMoved CC_CALLBACK_2(WjjnLayer::onTouchMoved, this); touchListener-onTouchEnded CC_CALLBACK_2(WjjnLayer::onTouchEnded, this); _eventDispatcher-addEventListenerWithSceneGraphPriority(touchListener, this); touchListener-setSwallowTouches(true); bool WjjnLayer::onTouchBegan(Touch* touch, Event* event) { return true; } void WjjnLayer::onTouchMoved(Touch* touch, Event* event) { } void WjjnLayer::onTouchEnded(Touch* touch, Event* event) { } 具体实现中 先加入以上在加入stduio中编辑的控件button的相关代码 加入触摸序列 是按钮优先级大于上面的优先级 如何让自定义Layer触发触摸事件 bool LayerXXX::init(){ this-setTouchEnabled( true ); CCTouchDispatcher* td CCDirector::sharedDirector()- getTouchDispatcher(); td-addTargetedDelegate( this, 0, true); // kCCMenuHandlerPriority - 10 // ... } CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类 CCTouchDispatcher中包含了两个CCTouchHandler的列表 分别存储StandardTouchHandler和 TargetedTouchHandler。 属性 this-mTouchPriporty Layer 优先级越小越高 越低越先响应事件 实验一当两个Layer优先级同等的时候会怎么样呢 实验发现同等优先级下后添加的Layer先响应事件。 // ------------------------------- // Touch1 100 // Touch2 100 Touch1Layer* touch1layer Touch1Layer::create( ccc4f( 255, 0, 0, 128), 100, 100 ); this- addChild( touch1layer ); touch1layer-setPosition( 200, 100 ); Touch2Layer* touch2layer Touch2Layer::create( ccc4f( 255, 255, 0, 128), 100, 100 ); this- addChild( touch2layer ); touch2layer-setPosition( 250, 100 ); // 结果 // Touch2 // Touch1 // ------------------------------- // Touch1 100 // Touch2 100 Touch2Layer* touch2layer Touch2Layer::create( ccc4f( 255, 255, 0, 128), 100, 100 ); this- addChild( touch2layer ); touch2layer-setPosition( 250, 100 ); Touch1Layer* touch1layer Touch1Layer::create( ccc4f( 255, 0, 0, 128), 100, 100 ); this- addChild( touch1layer ); touch1layer-setPosition( 200, 100 ); //结果Touch1Touch2------------------------------- Touch1 100 Touch2 99 Touch2Layer* touch2layer Touch2Layer::create( ccc4f( 255, 255, 0, 128), 100, 100 ); this- addChild( touch2layer ); touch2layer-setPosition( 250, 100 ); Touch1Layer* touch1layer Touch1Layer::create( ccc4f( 255, 0, 0, 128), 100, 100 ); this- addChild( touch1layer ); touch1layer-setPosition( 200, 100 ); // 结果 // Touch2 // Touch1 // 说明优先级越小越先触发事件 // ------------------------------- 如何阻塞事件的向后传递 原理 mSwallowsTouches false的时候该层的touch事件若接受处理后touch事件穿透进入下个注册touch事件的layer进行处理 若mSwallowsTouches true时当该层处理touch事件的时候若bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); return true时候则touch事件被该层接收走其他优先级较低的就不会接收到touch事件的处理申请了。 关于ccTouchBegan的返回值 true: 本层的后续Touch事件可以被触发并阻挡向后层传递 false: 本层的后续Touch事件不能被触发并向后传递 总结 如何阻塞事件的向后传递 主要是利用了TargetedTouchDelegate 的一个叫SwallowTouch的参数 如果这个开关打开的话 比他权限低的handler 是收不到 触摸响应的这里的权限低的意思是先看priority(priority越低的优先级越高)再看哪个Layer最后addChild进去(越后添加的优先级越高)。 CCMenu 就是开了Swallow 并且权限为-128(权限是越小越好)所以CCMenu的事件不会出现击穿 mSwallowsTouches true 并且 ccTouchBegan 返回 true 如何让Layer所有触摸同时穿透Begin、Move、End事件 mSwallowsTouches false 并且 ccTouchBegan 返回 true ccTouchBegan 返回 true 表示同层处理后续事件(吞噬) ccTouchBegan 返回 false 表示同层不处理后续事件(Move End Cancled) (击穿) mSwallowsTouches 设为 true 表示触摸不向下层传递(不一定 如mSwallowsTouches为true began返回false还是会向后传递) mSwallowsTouches 设为 false 表示触摸向下层传递(不知有啥用) this-mTouchPriporty 越小越先接收到触摸
this-mTouchPriporty 同等越后addChild的越先响应
如何管理多个对话框的优先级 事件的优先级和绘图的优先级的关系和区别 VertexZ 又是什么(VertexZ是openGl的z轴) 绘图的优先级叫ZOrder 如何改版绘图的优先级 如在容器中通过调用 this-reorderChild(CCNode* child, int zOrder); 如何设置触摸事件的优先级 CCTouchDispatcher::sharedDispatcher()-setPriority(kCCMenuTouchPriority - 1, layer); 如何得到触摸事件的优先级 this-mTouchPriporty (CCNode类成员 私有变量) 如何遍历容器获取特定的对象 void Touch1Layer::setFocus() { // 将zorder1; 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 i0; i arrChilds-count(); i) { CCLayerColor* layer dynamic_cast CCLayerColor* ( arrChilds-objectAtIndex(i) ); // 跳过自己(不撤销自己的优先级) if(layer ! NULL layer ! this) { // 将zorder0; 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值小的成员的上面 官方解释 Differences between openGL Z vertex and cocos2d Z order: - OpenGL Z modifies the Z vertex, and not the Z order in the relation between parent-children - OpenGL Z might require to set 2D projection - cocos2d Z order works OK if all the nodes uses the same openGL Z vertex. eg: vertexZ 0
warning: Use it at your own risk since it might break the cocos2d parent-children z order