zoukankan      html  css  js  c++  java
  • cocos2d-x触摸事件优先级

    

    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);


    结果:
    Touch1
    Touch2
    -------------------------------
    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()
    {
    // 将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值小的成员的上面;












    官方解释:


    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





    cocos2dx-lua 触摸锁定自身以外的层  

    2013-09-02 11:58:15|  分类: LUA |  标签: |举报 |字号 订阅




    self中来继承于CCLayer

    1、首先在初始化的时候要注冊触摸事件:
    local listener = function(eventType, x, y)
           -- log.debug(eventType.. "="..x)
            if eventType == CCTOUCHBEGAN then
                return self:touch_began(x, y)
            elseif eventType == CCTOUCHMOVED then
                self:touch_moved(x, y)
            elseif eventType == CCTOUCHENDED then
                self:touch_ended(x, y)
            elseif eventType == CCTOUCHCANCELLED then
                self:touch_cancelled(x, y)
            end
        end
        self:registerScriptTouchHandler(listener, false, -999999999, true) --注意,这儿第四个參数要设置为true,第三个參数为响应优先级,详细请參看文档

    2、打开当前所在layer的触摸事件
    self:setTouchEnabled(true)

    3、在開始触摸的时候返回true
    function HelloWorldLayer:touch_began(x, y)
        return true
    end

    这样之后,就仅仅有当前的layer能够响应触控事件了。

    分享到: 
    
  • 相关阅读:
    uva624 CD (01背包+路径的输出)
    算法:全排列
    Android使用Intent实现拨打电话的动作
    Java并发编程从入门到精通 张振华.Jack --我的书
    《算法导论》— Chapter 12 二叉查找树
    Java中arraylist和linkedlist源代码分析与性能比較
    Cg入门14:Vertex Shader
    Nucleus PLUS的启动、执行线程和中断处理
    Unity Shaders and Effects Cookbook (3-5) 金属软高光
    EasyDarwin开发出相似于美拍、秒拍的短视频拍摄SDK:EasyVideoRecorder
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6811114.html
Copyright © 2011-2022 走看看