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窗口的,即点击窗口外其他区域关闭此窗口。


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