又好久没有更新blog了,这段时间仍然是造那个车轮,是一个用opengl es1.0 + 一些平台相关的工具函数,实现的2d游戏gui引擎,还造得破破烂烂不堪入目的那种。结果却拿去做移植一个以gui表现为主的游戏。。。。。一开始还好,只是各种消息焦点、对象Capture引发的问题,直到后来的多点触摸。。。。。
刚开始虽然没有多点触摸的需求,但也是留有一个多点触摸的接口的,就是各种TouchDown、TouchMove、TouchUp里面都有传递一个TouchID,后来确定了使用多点触摸,于是原来的地方就出现了问题:
1、第一个手指点下某个对象A(比如按钮),这时A就记住了被某个TouchID点下的状态,保持点下状态,同时另外一个手指点击另一个对象B按钮,B按钮响应点击弹出一个界面,这个界面就把A挡在后面了,这时第一个手指才弹起来,这时的UI控件树第一个遍历到的是上面那个界面,于是A响应不到弹起的事件了。。。。
2、正常的UI消息传递都是父对象先把touch消息传给各个子对象,发现没有子对象响应时,才考虑父对象自己的响应。但如今要模仿iphone的那个滚动列表,滚动列表容器里面放了很多子对象,一开始,滚动容器处于静止状态,按下和弹起时,确实子对象先响应,但按下并移动到一个阈值,滚动容器进入滚动状态,于是让子对象响应失去消息,后面的移动就都是响应滚动了,直到弹起并再次点击,才响应停止滚动,进入正常状态。这样就有一个问题:无法嵌套多个滚动对象?,另外,也出现了各种响应不正常的bug
3、这个问题从上面扩展开来。一个项目做了一半,又要加入多点触摸进行放大缩小的功能,再加上上面的滚动列表功能,为了保持原来的功能不变,滚动列表的代码不改,于是设计了一个多点触摸对象作为父对象,初始化时确定最大支持的触控数量值,响应触摸时,响应回调函数来处理各种功能,另外回调函数还可以决定是否把触摸消息传给子对象。这样假设初始化一个2点触摸对象,回调函数判断只有一个触摸时,传递给滚动列表子对象,有两个触摸时,让滚动列表子对象失去消息,并再不传递给它,照理来说应该不会有什么隐患,不过测试多次,也是会出现响应不正常的bug。
解决方案:UI控件对象保存自己被哪个Touch对象响应到 是有缺陷的,应该是实现一系列Touch对象,让Touch对象保存响应的UI对象。这样貌似整个框架要重构?
posted on 2010-12-17 23:26
陈昱(CY) 阅读(3149)
评论(10) 编辑 收藏 引用 所属分类:
C++ 、
游戏编程