cocos2dx、cocostudio的一些技術討論一:觸摸吞噬

最近做的2d項目,用的是cocos2dx和cocostudio,話說cocostudio雖然提高了一些開發效率,但還是有很多缺陷和不好的地方,單說bug就有不少,而且穩定性還有待進一步的提高。不過總體來說,用的還可以,畢竟和unity這個商業化的引擎提供的工具是沒法比的。還是說說開發中遇到的一些棘手的問題吧。

1:彈框的觸摸問題

相信做手機開發的人對觸摸的層疊問題一定都印象深刻吧,這也是個挺頭疼的問題。cocos2dx的觸摸處理是一層層傳遞的,而且menu的觸摸級別比layer高,這就導致上層的觸摸很傳遞到下層的按鈕上,導致面板彈出的混亂。cocostudio的觸摸傳遞不太一樣,它所有的單元widget都可相應觸摸,級別也都是一樣的,等同處理,這就避免了級別的混亂。cocos2dx要處理彈框的觸摸問題,處理方法可以是,layer的觸摸級別設置的比menu(-128)高(-129)或同級(保證沒有其他單元觸摸級別比他高),然後再layer 的觸摸函數上處理觸摸的傳遞(也就是把無需響應的觸摸吞噬到,不再傳遞到下一層上),如下(lua版本):

	local function onTouch(event, x, y)
		if event == "began" then
			for child in self:getChildren() do
				if child:boundingBox():containsPoint(x,y) then
					-- 傳遞觸摸
					return false
				end
			end
			-- 吞噬觸摸
			return true
		end
	end
	self:registerScriptTouchHandler(onTouch, false, -129, true)
	self:setTouchEnabled(true)

針對cocostudio的實現不同,處理ULLayer的觸摸傳遞有些不同我們只需把我們彈框的背景加上觸摸以及加層遮罩(顏色可有可無):

	local _bg = UIImageView:create()
	_bg:setTexture("image/...")
	_bg:setScale9Size(CCSizeMake(display.width, display.height))
	_bg:setPosition(ccp(display.width/2, display.height/2))
	_bg:setTouchEnable(true)
	ui:addWidget(_bg)

	local autoRemove = autoRemove or false
	if autoRemove then 
		local function onTouchHandler(event, eventSource)
			if event == "began" then
				-- 關閉窗口
				self:close()
			end
		end
		_bg:addScriptHandler(onTouchHandler)
	end

以上是處理的方式 ——_bg一定是UILayer的第一個child,裏面的加了一個touchhandler,主要是用來處理tips窗口的,即點擊窗口外其他區域關閉此窗口。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章