1. 多點觸摸 (2.2.6)
1.1 多點觸摸的基礎(chǔ)使用
簡化流程:
- 開啟觸摸
- 選擇觸摸模式
- 設(shè)置觸摸監(jiān)聽事件
詳細(xì)代碼:
self.sprite:setTouchEnabled(true)
self.sprite:setTouchMode(cc.TOUCH_MODE_ALL_AT_ONCE) -- 多點
--self.sprite:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE) -- 單點(默認(rèn)模式)
event.name
為觸摸事件的狀態(tài):began
,moved
,ended
,cancelled
,added
(僅限多點觸摸),removed
(僅限多點觸摸)多點觸摸時冤竹,
event.points
保存的為多個觸摸點,所以需要遍歷每個觸摸點來對觸摸點進行特殊化處理
self.sprite:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
if event.name == "began" or event.name == "added" then
self.touchIndex = self.touchIndex + 1
for id, point in pairs(event.points) do
--對每個點進行處理
end
elseif event.name == "moved" then
for id, point in pairs(event.points) do
end
elseif event.name == "removed" then
for id, point in pairs(event.points) do
self.cursors[id]:removeSelf()
self.cursors[id] = nil
end
else
for _, cursor in pairs(self.cursors) do
cursor:removeSelf()
end
self.cursors = {}
end
end
1.2 保證觸摸在矩形范圍內(nèi)才有效
- 給當(dāng)前精靈繪制一個矩形區(qū)域
- 取得矩形區(qū)域
- 判斷觸摸點是否在矩形區(qū)域
詳細(xì)代碼如下:
畫出矩形范圍,加入父節(jié)點
function drawBoundingBox(parent, target, color)
local cbb = target:getCascadeBoundingBox()
local left, bottom, width, height = cbb.origin.x, cbb.origin.y,
cbb.size.width, cbb.size.height
local points = {
{left, bottom},
{left + width, bottom},
{left + width, bottom + height},
{left, bottom + height},
{left, bottom},
}
local box = display.newPolygon(points, 1.0)
box:setLineColor(color)
parent:addChild(box, 1000)
end
取得矩形并且判斷觸摸點是否在矩形內(nèi)
local rect = self.sprite:getBoundingBox()
if rect:containsPoint(cc.p(point.x, point.y)) then
-- 檢查觸摸點的位置是否在矩形內(nèi)
end
1.3 觸摸捕獲事件
什么是觸摸捕獲事件
它是觸摸事件的第一個階段淑际,如果事件返回結(jié)果為false,就不觸發(fā)觸摸事件
觸摸捕獲事件的性質(zhì)
- 觸摸捕獲事件是默認(rèn)開啟的
setTouchCaptureEnabled(true)
- 觸摸捕獲事件優(yōu)先級高于觸摸事件,并且有權(quán)不分發(fā)給觸摸事件響應(yīng)
觸摸捕獲事件的流程
-
遍歷所有響應(yīng)觸摸的節(jié)點茵乱,找出顯示層級最高(
zOrder
高到低),并且其觸摸區(qū)域包含觸摸位置的節(jié)點Node孟岛,標(biāo)記為TargeNode - 檢查TargeNode是否有開啟觸摸捕獲瓶竭,如果返回false,重復(fù)1
- 從TargeNode的根節(jié)點(一般為Sence)開始渠羞,檢查
cc.NODE_TOUCH_CAPTURE_EVENT
事件的返回結(jié)果斤贰,任何一個節(jié)點返回false都會阻止事件在TargeNode上觸發(fā)。重復(fù)123
以下是cc.NODE_TOUCH_CAPTURE_EVENT
的事件監(jiān)聽
self.button2:addNodeEventListener(cc.NODE_TOUCH_CAPTURE_EVENT, function(event)
printf("%s %s [CAPTURING]", "button2", event.name)
return true
end)
1.4 觸摸事件的流程
觸摸事件分為三個階段:capturing(捕獲) targeting(觸發(fā)) bubbling(冒泡或傳遞)
觸發(fā)流程
在TargetNode上觸發(fā)事件次询,響應(yīng)自己的觸摸事件荧恍,如began,moved屯吊,ended等
冒泡流程
在TargetNode完成事件響應(yīng)后送巡,檢查它是否將觸摸吞噬(isTouchSwallowEnabled()
),如果有盒卸,就不再將事件往下傳遞
1.5 禁用觸摸
如果禁用某個節(jié)點的觸摸事件骗爆,它的子節(jié)點仍舊響應(yīng)觸摸。所以如果當(dāng)我們需要禁止對話框中的所有 Node 響應(yīng)觸摸蔽介,那么就要禁止對話框 Node 捕獲事件(setTouchCaptureEnabled(false)
)