您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx、cocostudio的一些技术讨论一:触摸吞噬

2014-04-12 17:42 127 查看
最近做的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窗口的,即点击窗口外其他区域关闭此窗口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2dx cocostudio
相关文章推荐