quick的觸摸機制,我想廖大已經在這篇文章裏說的很清楚了,我們這些小輩們就是在他的基礎上完備一下,說說用法就可以了,嘿嘿。
在2.2.3之前的版本(不包括2.2.3),觸摸機制和廖大在那篇文章裏面的說的一樣,添加觸摸響應採用addTouchEventListener來完成,不過在此之後,對觸摸機制就進行了完全的改寫,和cocos2dx 3.0的版本一樣,採用更加靈活的CCNode事件分發機制。
如果你對cocos 3.0中觸摸機制很瞭解,那麼quick的觸摸使用起來也很方便。直接來看怎麼用。
在前面已經說了,我們添加的節點元素都是在scene中的,但是觸摸響應不能直接給scene添加事件監聽,所以我們可以用一個層來完成。並且,如果能夠接受觸摸響應,還需要開啓觸摸功能。
local layer = display.newLayer()
self:addChild(layer)
layer:setTouchEnabled(true)
layer:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE)
layer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function (event)
local x, y, prevX, prevY = event.x, event.y, event.prevX, event.prevY
if event.name == "began" then
print("layer began")
elseif event.name == "moved" then
print("layer moved")
elseif event.name == "ended" then
print("layer ended")
end
return true
end)
從上面的代碼可以看到,可以設置觸摸的模式,
cc.TOUCH_MODE_ONE_BY_ONE 是單點觸摸
cc.TOUCH_MODE_ALL_AT_ONCE 是多點觸摸
在添加節點事件監聽addNodeEventListener中,我們設置監聽事件的類型是cc.NODE_TOUCH_EVENT
這個監聽事件類型,其定義了幾個引擎級事件,分別是,
-- cocos2dx 引擎級事件
c.NODE_EVENT = 0
c.NODE_ENTER_FRAME_EVENT = 1
c.NODE_TOUCH_EVENT = 2
c.NODE_TOUCH_CAPTURE_EVENT = 3
c.MENU_ITEM_CLICKED_EVENT = 4
c.ACCELERATE_EVENT = 5
c.KEYPAD_EVENT = 6
其次是event參數,在event參數裏,裏面有name,x,y,prevX,prevY 這五個變量,分別代表着
-- event.name 是觸摸事件的狀態:began, moved, ended, cancelled, added(僅限多點觸摸), removed(僅限多點觸摸)
-- event.x, event.y 是觸摸點當前位置
-- event.prevX, event.prevY 是觸摸點之前的位置
所以添加上面的代碼,簡單觸摸屏幕,就可以看到log中的print的結果。
在觸摸的回調函數function(event)中,記得考慮是否需要添加返回值,返回值的作用不用多說,true則後面的moved,ended等狀態會接收到,否則接收不到,默認如果不添加則代表false。
在新版觸摸機制中,還需要主要的一個就是觸摸吞噬,
setTouchSwallowEnabled(true)
它的作用就是是否繼續傳遞觸摸消息,在繪製節點的時候,越是在屏幕上方,就是zOrder越大,越優先接收到觸摸事件,如果設置吞噬,那麼在它下方的節點都不會接收到觸摸消息了。默認如果不設置則quick自動設置爲true。
當然,不僅僅可以給layer添加觸摸事件,你也可以給精靈添加,這就看你遊戲的需要了。