cocos2d-lua 触摸事件
转载:http://www.cocos.com/doc/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/framework/quick/V3/touch-events/zh.mdQuick 中的触摸事件Cocos2d-x 原本的触摸机制存在一些限制,在使用中需要开发者做不少额外的处理。所以 Quick-Cocos2d-x 提出了自己的一套触摸机制。本文详细介绍了这套新机制的用法。 显示层级 在 Cocos2d-x 里,整个游戏的画面是由一系列的 Scene,Node,Sprite,Layer 等对象构成的。而所有这些对象都是从 Node 这个类继承而来。我们可以将 Node 称为 一个游戏画面就是许多显示节点构成的一棵树: /| | 显示层级 | | [Node] [Node] [Node] | | | | | +---+---+ | | | | | [Node] [Node] | | | | +-----+-----+ | | | [Node] 在这棵树里,Node 所处的垂直位置就是它们的 触摸区域在 Cocos2d-x 里,只有 Layer 对象才能接受触摸事件。而 Layer 总是响应整个屏幕范围内的触摸,这就要求开发者在拿到触摸事件后,再做进一步的处理。 例如有一个需求是在玩家触摸屏幕上的方块时,人物角色做一个动作。那么使用 Layer 接受到触摸事件后,开发者需要自行判断触摸位置是否在方块之内。当屏幕上有很多东西需要响应玩家交互时,程序结构就开始变得复杂了。 所以 Quick-Cocos2d-x 允许开发者将任何一个 Node 设置为接受触摸事件。并且触摸事件一开始只会出现在这个 Node 的 所谓
为了简化实现, 用法示例 下面列出触摸事件的用法示例,更详细的示例请参考 单点触摸事件-- 允许 node 接受触摸事件 node:setTouchEnabled(true) -- 注册触摸事件 node:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event) -- event.name 是触摸事件的状态:began,moved,ended,cancelled -- event.x,event.y 是触摸点当前位置 -- event.prevX,event.prevY 是触摸点之前的位置 printf("sprite: %s x,y: %0.2f,%0.2f",event.name,event.x,event.y) -- 在 began 状态时,如果要让 Node 继续接收该触摸事件的状态变化 -- 则必须返回 true if event.name == "began" then return true end end) 触摸事件的
多点触摸-- 允许 node 接受触摸事件 node:setTouchEnabled(true) -- 设置触摸模式 node:setTouchMode(cc.TOUCH_MODE_ALL_AT_ONCE) -- 多点 -- node:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE) -- 单点(默认模式) -- 注册触摸事件 node:addNodeEventListener(cc.NODE_TOUCH_EVENT,cancelled -- 多点触摸增加了 added 和 removed 状态 -- event.points 包含所有触摸点 -- 按照 events.point[id] = {x = ?,y = ?} 的结构组织 for id,point in pairs(event.points) do printf("event [%s] %s = %0.2f,id,point.x,point.y) end if event.name == "began" then return true end end) 在多点触摸时,事件状态的含义有所区别:
触摸事件吞噬 默认情况下,Node 在响应触摸后(在 如果要改变这个行为,可以用:
禁用触摸对于一个 Node,随时可以启用或禁用其触摸事件:
但即便禁用了 Node 的触摸事件,也只能阻止这个 Node 响应触摸,而不能阻止这个 Node 的子 Node 响应触摸。 假设有一个对话框(Node),我们需要禁止对话框中的所有 Node 响应触摸。那么需要禁止对话框 Node 捕获事件: dialog:setTouchCaptureEnabled(false)
总结而言, 触摸事件的三个阶段quick 中触摸事件分为三个阶段:capturing(捕获)、targeting(触发)、bubbling(冒泡)。 当用户的一根手指触摸到屏幕时,将产生一个触摸事件:
利用事件的三个阶段,我们可以注册 -- 在 capturing 阶段就捕获事件 node:addNodeEventListener(cc.NODE_TOUCH_CAPTURE_EVENT,function(event) if event.name == "began" then -- 在 began 状态返回 false,将阻止事件 return false end end) 关于触摸机制的灵活运用,可以参考 API 参考
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |