关于quick-2dx多层Layer堆叠触摸事件穿透
开发过程中,在一个场景上添加了多个层以后,会使触摸事件从上层全部传递到底层响应所有相关控件。所以我们需要截断这个触摸事件.
必须对quick2dx的层传递机制有个了解。官网地址:http://cn.quick-x.com/?p=1504
触摸的事件传递是从上层向下层出发的。游戏开发过程中,对场景层的管理要很清晰。比如一个场景下到底有多少个层,层与层之间谁高谁低.
首先确保场景的唯一性,也就是只创建唯一的场景来显示多层layer,不能把scene与layer之间的概念给混淆了。
唯一的场景可以有很多的layer堆叠在上面的,但是作为一个功能齐全(有触摸监听)的场景,需要至少一个自身创建的layer添加到场景中.
因为有关于监听的事件,都是在Layer中进行添加并监听的。
强烈不建议将显示层的东西(Sprite,MenuItemImage,Menu..)添加到场景(like this: scenes:addChild(sprite))
正确的做法是在刚刚创建场景的时候,我们有创建一个默认层,将所有的显示层的东西都应该添加到这个默认层中
然后我们可能需要弹出一个Layer覆盖在前一个Layer上面,弹出过程需要做的处理是:
把场景的默认Layer的监听给setTouchEnabled(false)掉(避免防止上层的layer点击事件下层的layer也可以接收到引起的触摸穿透。),
new一个新的Layer,记得在新的Layer的构造函数中把那唯一的场景作为参数传递进去。
因为在移走上层layer时,下层layer需要使用场景(scenes),像这样操作(callbackScene.layer:setTouchEnabled(true))打开原有的监听,
不能上层layer移走了,下层layer监听没了,不响应触摸事件了。
至于对象的添加是要有条理的,不能在层变多变复杂的时候,对层上的精灵的添加出现混乱问题。同样监听也同样需要条理
先看如何在场景里面创建默认的层,然后在默认的层上添加监听,这样就可以实现对屏幕的监听,代码如下:
需要注意的是:打开默认self.layer的监听,如下:
这时我们需要加载第二层,大概如下:
local secondLayer = require("scenes.ItemLayer").new(self)
不过需要注意的是:添加第二层时,把穿透问题避免掉,如下:
self.layer:setTouchEnabled(false)
这样,默认层就不会接收事件了。
可以看到我这里传了一个self值,这个值就是MainScene的值,也就是把主场景的self传递给了第二层Layer,
第二层Layer的大概构造函数可以这样写:(主要是为了传递主场景的引用过来)
然后,我们移走第二层,这时需要把默认第一层的layer监听给打开,
这时用到我们刚刚传进来的主场景引用实例了,
代码这样写:
mainScene.layer:setTouchEnabled(true)
这样就可以完成层与层间的触摸穿透问题了。