cocos-lua學習筆記(十一)事件分發機制

      網友投稿 984 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)

      2.檢查targetnode 的isTouchCaptureEnabled結果,返回false則重復(1) 這個階段叫capturing

      3.在targetnode觸發事件,這個階段叫targeting

      4.返回false,表示targetnode不響應事件,重復步驟(1)開始查找符合條件的Node

      5.targetnode觸發事件完畢,檢查isTouchSwallowEnabled。如果為true取消bubbling階段

      cocos-lua學習筆記(十一)事件分發機制

      6.從targetnode開始往其父node觸發事件,直到某個Node返回false或者事件吞噬,這個階段叫bubbling。

      事件冒泡補充:

      當事件發生后,這個事件就要開始傳播(從里到外或者從外向里)。為什么要傳播呢?因為事件源本身(可能)并沒有處理事件的能力,即處理事件的函數(方法)并未綁定在該事件源上。例如我們點擊一個按鈕時,就會產生一個click事件,但這個按鈕本身可能不能處理這個事件,事件必須從這個按鈕傳播出去,從而到達能夠處理這個事件的代碼中(例如我們給按鈕的onclick屬性賦一個函數的名字,就是讓這個函數去處理該按鈕的click事件),或者按鈕的父級綁定有事件函數,當該點擊事件發生在按鈕上,按鈕本身并無處理事件函數,則傳播到父級去處理。

      Lua

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:在鯤鵬云服務器制作keycloak docker鏡像
      下一篇:Hadoop快速入門——第二章、分布式集群(第四節、搭建開發環境)
      相關文章
      久久亚洲精品成人av无码网站| 在线a亚洲v天堂网2019无码| 亚洲精品午夜无码电影网| 亚洲第一区精品观看| 日本系列1页亚洲系列| 亚洲精品无码专区在线| 亚洲国产欧美国产综合一区| 亚洲国产精品无码久久| 亚洲av综合av一区二区三区| 亚洲人成网站在线播放2019 | 亚洲人成色77777| 亚洲日韩精品无码一区二区三区 | 久久99亚洲综合精品首页 | 亚洲91精品麻豆国产系列在线| 中文字幕在线观看亚洲| 久久久亚洲AV波多野结衣| 亚洲视频在线观看免费视频| 亚洲日本一区二区三区| 7777久久亚洲中文字幕蜜桃| 亚洲欧洲日本天天堂在线观看| 亚洲国色天香视频| 亚洲视频无码高清在线| 亚洲一区二区三区成人网站 | 久久久久久a亚洲欧洲AV| 亚洲视频免费播放| 亚洲国产成AV人天堂无码| 亚洲avav天堂av在线网爱情| 亚洲AV成人一区二区三区在线看| 中国亚洲呦女专区| MM1313亚洲精品无码久久| 亚洲精品国产成人影院| 亚洲中文字幕第一页在线| 亚洲AV无码第一区二区三区| 久久精品九九亚洲精品| 亚洲av无码片区一区二区三区| 亚洲国产欧洲综合997久久| 亚洲人成网站18禁止一区| 亚洲精品蜜桃久久久久久| 蜜芽亚洲av无码精品色午夜| 亚洲AV无码成人专区| 亚洲AV成人无码久久WWW|