项目中有这样一个面板Main,里面有两个页签Tab1和Tab2,通过点击页签来切换对应的Layer1和Layer2,不显示的Layer执行setPosition(ccp(999999,0))和setVisible(false),显示的Layer执行setPosition(ccp(0,0))和setVisible(true),其中Layer2设置了触摸机制,代码如下:
self.bgLayer=CCLayer:create()
local function tmpHandler(...)
return self:touchEvent(...)
end
self.bgLayer:registerScriptTouchHandler(tmpHandler,false,-(self.layerNum-1)*20-3,false)
self.bgLayer:setTouchPriority(-(self.layerNum-1)*20-3)
self.bgLayer:setTouchEnabled(true)
self.bgLayer:setBSwallowsTouches(false)
现在的问题是显示Layer2后再切回Layer1的显示的话,点击Layer1会触发Layer2的触摸事件。
通过查询资料才知道:
CCLayer无论是隐藏还是显示都会收到触摸消息,如果希望窗口(一个CCLayer)在显示的时候才收到触摸,那么可以在began的时候返回isVisible()。
问题解决了,现在让我们整理一下cocos2dx的触摸机制:-
触摸消息类型
触摸有开始(ccTouchBegan)、移动(ccTouchMoved)、结束(ccTouchEnded)、取消 (ccTouchCancelled)类型的消息。一个点击动作会有以下消息顺序:began->ended。cancel只有在手机上按到 home键或者有电话的情况下才会触发。
代码示例如下:(在began的时候返回true或1,后续才会收到end、move和cancel。)
function MainTab2:touchEvent(fn,x,y,touch)
if fn=="began" then --开始elseif fn=="moved" then --移动elseif fn=="ended" then --结束else --取消end
end
- setTouchEnabled(true)注册完触摸事件后如果setTouchEnabled(true)则触摸事件生效,否则触摸没有响应。
-
CCLayer::registerScriptTouchHandler()一共有4个参数,用于回调的函数,是否接受多点触摸,优先级,是否吞并。
~~~~~~~~有时间看下底层逻辑~~~~~~~~