最近在研究cocos2dx的多点触控,发觉网上的资料大部分只局限在侦听器和侦听函数上,对于多点触控touches[]数组的描述比较少,在这个帖子里可以总结一下。
void onTouchesBegan(const std::vector<Touch*>& touches,cocos2d::Event *unused_event){}
这个函数会在屏幕被点击的时候被调用,需要注意的是虽然参数列表传入的是一个touches数组,但是实际上绝大部分情况下每次函数调用时只会有一个Touch对象,两个手指同时点击出现两个Touch对象是不存在的。
void onTouchesMoved(const std::vector<Touch*>& touches,cocos2d::Event *unused_event){}
这个函数会在手指接触到屏幕并且移动时被调用。调用时,不管手指是否移动,只要接触了屏幕,都会被传入touches数组。对于单点触控,touches[0]就是触控点。而对于多点触控,touches数组有一个颇为复杂的“记忆机制”。
我们从一个典型的多点触控情况来分析这个“记忆机制”。
左手拇指接触屏幕并移动,此时touches数组长度为1,touches[0]是第一个接触点。
右手拇指接触屏幕并移动,此时touches数组长度为2,touches[0]是第一个接触点、touches[1]就是第二个接触点。
保持两个手指的接触,无论两个手指如何滑动,数组下标和接触点的对应关系不变。
此时如果右手拇指脱离接触,那么touches数组长度为1,touches[0]是第一个接触点。如果右手拇指重新接触, 那么touches数组长度为2,touches[0]是第一个接触点。touches[1]是第二个接触点。
此时如果左手拇指脱离接触,那么touches数组长度为1,touches[0]是第二个接触点。如果左手拇指重新接触,
那么touches数组长度为2,touches[0]是第一个接触点。touches[1]是第二个接触点。
记忆机制出现在这里,touches会记忆单次触控的touch下标,在多点触控中,如果前面的touches[0]对应的触摸停止了,数组长度-1,touches[1]..[2]的下标会暂时前移成..[0]..[1],而当有新的触摸事件之后,新的触摸点会重新绑定到touches[0],而..[0]..[1]会重新回到最初的touches[1]..[2]。这种记忆会在一次连续的触摸中保持存在,如果触摸停止了,记忆机制不会继续延续。