cocos-lua学习笔记(十一)事件分发机制

网友投稿 860 2022-05-29

一、Quick框架的事件按照功能和用途分为:

节点事件

桢事件

键盘事件

加速计事件

触摸时间

节点事件

Node进入和退出场景时触发,加入一个层或者其他的Node,添加清楚数据,也会触发。

function MainScene:ctor() --事件分发机制-节点事件 local function createTestScene(name) local scene = display.newScene(name) scene:addNodeEventListener(cc.NODE_EVENT, function(event) printf("node in scene [%s] NODE_EVENT:%s",name,event.name)end) return scene end self:performWithDelay(function () local scene1 = createTestScene("scene1") display.replaceScene(scene1) scene1:performWithDelay(function () print("-----------") local scene2 = createTestScene("scene2") display.replaceScene(scene2) end, 1.0) end, 1.0) end

帧事件

每一帧会触发

--事件分发机制-节点事件 local function createTestScene(name) local scene = display.newScene(name) scene:addNodeEventListener(cc.NODE_EVENT, function(event) printf("node in scene [%s] NODE_EVENT:%s",name,event.name)end) return scene end self:performWithDelay(function () local scene1 = createTestScene("scene1") display.replaceScene(scene1) scene1:performWithDelay(function () print("-----------") local scene2 = createTestScene("scene2") display.replaceScene(scene2) end, 1.0) end, 1.0)

键盘事件

监听代码如下:

function MainScene:ctor() self:setKeypadEnabled(true) self:addNodeEventListener(cc.KEYPAD_EVENT, function(event) print("test"..event.key) end ) end

加速计事件

手机上接收 x,y,z三个方向重力感应

cc.Device:setAccelerometerEnabled(true) local function accelerometerListener(event,x,y,z,timestamp) print("TestAccelerateEvent"..x..y..z..timestamp) end local listener = cc.EventListenerAcceleration:create(accelerometerListener) self:getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, self)

触摸事件

local MainScene = class("MainScene", function()     return display.newScene("MainScene") end) function MainScene:ctor()     --触摸事件:单点触摸     local node = display.newSprite("dog.png")     node:addNodeEventListener(cc.NODE_TOUCH_EVENT,function ( event )         printf("Sprite:%s | x = %0.2f | y = %0.2f",event.name,event.x,event.y)         if event.name == "began" then             return true         end     end)     self:addChild(node)     node:setPosition(display.cx+100,display.cy+100)     node:setTouchEnabled(true)         node:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE) end function MainScene:onEnter() end function MainScene:onExit() end return MainScene

--触摸事件:多点触摸     local node = display.newSprite("dog.png")         node:addNodeEventListener(cc.NODE_TOUCH_EVENT,function (event)         for id,point in pairs(event.points) do             printf("event [%s] | id = %s | x = %0.2f | y = %0.2f",event.name,id,point.x,point.y)         end         if event.name == "began" then             return true         end     end)     self:addChild(node)     node:setPosition(display.cx+100,display.cy+100)     node:setTouchEnabled(true)     node:setTouchMode(cc.TOUCH_MODE_ALL_AT_ONCE)

二、事件的过程

Node响应触摸后(在began状态返回true,表示要响应触摸),就会阻止事件继续传递给Node的父对象(更下层的Node),成为事件吞噬

setTouchSwallowEnabled()可以改变这个行为,默认为true。如果为false,则事件还会继续传递

isTouchSwallowEnabled()检查Node的吞噬状态

setTouchEnabled()是否允许Node响应触摸,默认为false。尽管该节点被禁止,不会影响Node的子节点响应

isTouchEnabled()判断是否允许触摸

setTouchCaptureEnabled()检查是否允许Node捕获触摸,默认为true,当设置为false时,该Node及所有的子Node都无法触摸事件

isTouchCaptureEnabled()检查是否允许捕获触摸

setTouchEnabled只影响当前节点

setTouchCaptureEnabled会影响当前及所有子节点

(1)捕获

(2)触发

(3)冒泡

用一个手指触碰屏幕

1.遍历所有响应的触摸Node,找出显示层级最高,并且触摸区域包含触摸的位置 的那个Node。该Node称为TargetNode(目标Node)

cocos-lua学习笔记(十一)事件分发机制

2.检查targetnode 的isTouchCaptureEnabled结果,返回false则重复(1) 这个阶段叫capturing

3.在targetnode触发事件,这个阶段叫targeting

4.返回false,表示targetnode不响应事件,重复步骤(1)开始查找符合条件的Node

5.targetnode触发事件完毕,检查isTouchSwallowEnabled。如果为true取消bubbling阶段

6.从targetnode开始往其父node触发事件,直到某个Node返回false或者事件吞噬,这个阶段叫bubbling。

事件冒泡补充:

当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。

Lua

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【你好,同路人】不入闹市,炼数成金
下一篇:Python实现哲学家就餐问题实例代码
相关文章