cocos2d 触摸事件跟踪

来源:互联网 发布:巨人网络征途 编辑:程序博客网 时间:2024/04/30 23:10

    前些天写程序遇到一个问题,关于cocos2d里的多点触摸事件。

    当时,我需要同时跟踪几个完整的触摸事件。这些完整的触摸事件包括了这些触摸点的起始位置,中途的移动位置,以及最后的弹起位置。3个位置,对应cocos2d三个触摸回调函数:

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

    这个三个函数,说来也只是硬件上的数据映射,相互之间似乎没有任何联系。比如开始有三个触点,begin带回的touches里,自然有三个对象。然后硬件上,一个触点开始移动,moved带回的touches里也会包含这1个对象,当然只有1个,因为其他两个触点没移动。问题便是,如何才能知道当前移动的触点是三个触点中的哪一个?

    说下当时走的弯路,自己查阅了UITouch带回的信息,发现一个info结构体,包含了触点上次的位置,以及当前的位置。便想从这点出发解决问题。自己写了个双向链表记录每个begin传回的触点的位置。然后与moved和ended里传回的位置比较,相同便是同一触点。这个方法在单点触摸的时候能行通,在多点触摸的时候有点问题:moved里传回的触点的位置,与ended里传回的触点上次位置,居然不一致。哪怕是同一个触摸事件,传回的坐标也不一致。这个问题我到现在也没弄明白。如果有人知道,请告诉一声。

    最后的解决方法很简单。需要跟踪一个触摸事件,其实只需要跟踪触摸事件的地址便可。也就是说,begin,moved以及ended中传回的UITouch对象,在同一个触摸事件下,只有一个共同点,那便是对象地址是一样的。可以利用这一点来追踪一个完整的触摸事件。

例如在begin里保存UITouch对象地址,在moved的UITouch里比较这个地址,相同便是同一个触摸事件。在多点触摸中需要分辨各个触摸点的情况时,这个方法比较有效。