美文网首页Cocos Creatorcocos 2dxcocos2d-Lua
五,EvenetListenerTouchOneByOne单点触

五,EvenetListenerTouchOneByOne单点触

作者: 亮亮同学 | 来源:发表于2017-11-07 20:57 被阅读21次

    cocos2d-x技术群新群:117871561
    c++技术交流群:593010226

    这里不死抠cocos-lua组件的原理, 重在快速上手使用, 只针对快速开发,所以我尽量用简洁 易懂的 文笔去阐述。

    在一个公司里能运用手上的知识 快速的完成一个功能才是最好的,也可已根据自己的能力和时间 去选择是不是要深入的了解这些组件及功能。

    当然我的文章 也会根据我对cocos2d-lua的了解程度 不断更新,完善,希望能帮助在职场打拼的朋友从菜鸟到大神

    综述:单点触摸事件实现点击某个点 而做出预期的响应
    注意:单点触摸事件针对的对象 主要是 Sprite(精灵),layer(层)等节点对象

    示例:

    --创建一个场景,单点触摸事件的实现都在这个场景中
    function HelloScene:createLayer()
    --创建一个层
      local   heLayer = cc.Layer:create()
    --创建一个背景
       local bg = cc.Sprite:create("bg.png") 
    --获取屏幕大小
    lcoal winSize = cc.Director:getInstance():getWinSize()
    --设置背景图的大小为屏幕的大小
    bg:setContentSize(WinSize.width,WinSize.height)
    bg:setPosition(cc.p(WinSize.width/2,WinSize.height/2))
    heLayer:addChild(bg,1)
    
    local image1 = cc.Sprite:create(image_1.png)
    image1:setPosition(cc.p(WinSize.width/2,WinSize.height/2))
    image1:setTag(1)
    bg:addChild(image1,2)
    
    local image2 = cc.Sprite:create(image_2.png)
    image2 :setPosition(cc.p(image1:getPositionX(),image1:getPositionY()-100)
    image2:setTag(2)
    bg:addChild(image2,3)
    
    --开始触摸回掉函数
      local function touchbegan(touch , event)
      --获取点击的node
      local  nNode  = event:getCurrentTarget()
      --获得触摸点相对于精灵的坐标
      lcoal pos = nNode:convertToNodeSpace(touch:getLocation())
    --获得node的大小
      local size = nNode:getContentSize()
    --获得Node的一个矩阵参数分别是横坐标,纵坐标,宽,高
      lcoal rec = cc.rect(0,0,size.width,size.height)
    --判断点击范围是否在这个Node范围内 如果在则进行动画
      if cc.rectContansPoint(rec,pos)
       then
        nNode:runAction(cc.ScaleBy:create(0.1,2))
      end
    end
    --移动回调
    local function touchmove(touch,event)
      local nNode = event:getCurrentTarget()
    loca posX,posY = nNode:getPosition()
    --获得当前位置与初始位置的差
      local dif = touch:getDelta()
      node:setposition(cc.p(posX+dif.x,posY+dif.y))
    node:runAction(cc.Scaleto:create(0.2,1))
    end
    
    local function touchended(touch ,event)
    local nNode = event:getCurrentTarget()
    local pos = nNode:convertToNodeSpace(touch:getLocation())
    lcoal size = nNode:getContentSize()
    local  rec = cc.rect(0,0,size.width,size.height)
    if rectContansPoint(rec,pos)
      then
        nNode:setColor(cc.c3b(0,25,25))
      end
    end
    --创建OneByOne事件监听器
    local listener1 = cc.EventListnerTouchOneByOne:create()
    --设置吞没事件 设置true 当点击某个精灵时时间不会传到下一个层级低的精灵
    listener1:setSwallowTouches(true)
    --添加开始触摸事件回掉函数
    listener1:registerScriptHandler(touchbegan,cc.Handler.EVENT_TOUCH_BEGAN)
    --添加 移动事件回掉函数
    listener1:registerScriptHandler(touchmove,cc.Handler.EVENT_TOUCH_MOVED)
    --添加 触摸结束回掉
    listener1:registerScriptHandler(touchended,cc.Handler.EVENT_TOUCH_ENDED)
    --创建事件分发器 (负责监听器的注册和注销,事件的分发)
    local eventDispatcher = cc.Director:getInstance():getEventDispatcher()
    --添加监听器 参数分别是  监听器,图片标签
     --addEventListenerWithSceneGraphPriority添加的时间优先级顺序与精灵的显示顺序一样,当图片重叠时,触摸到的时层级最大的哪个
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener1,1)
    --设置image2的单点触摸
    --clone()用于获取新的事件监听器对象
    lcoal listener2 = listener1:clone()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener2,2)
    return layer
    end
    

    相关文章

      网友评论

        本文标题:五,EvenetListenerTouchOneByOne单点触

        本文链接:https://www.haomeiwen.com/subject/ymajmxtx.html