五,EvenetListenerTouchOneByOne单点触摸事件

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单点触摸事件)