说实话,在接触iphone开发以来,一直都不太喜欢obj-c的风格,所以我的引擎中几乎所有的代码都是脱离obj-c的,但是iphone平台中的一些特色我们一定要使用,不然也太对不起iphone了,其中有一项很重要的功能就是多点触摸,一般在游戏开发中有两种方式处理iphone的多点触摸功能,第一种是回调方式,即把事件一层层回调到我们需要的地方去,然后响应相应的操作,第二种是存储方式,即把事件的数据记录下来,等需要使用的时候再使用它,由于我想脱离obj-c,而且我不想把我引擎的GUI进行大改,所以我使用第二种方式,这样我们想用的时候就可以调出来用。
在开始之前,我们用一个结构CCTouch来表示要存储的数据,不过iphone的触摸系统中,我们到底需要的是些什么东西?我们先考虑最基本的需求,模拟Mouse!Mouse一个最基本的功能就是记录当前所在的坐标,左键,右键,中键按下抬起事件及当前键的状态。在iphone的触摸系统里,提供了一个tapcount参数,其实我个人觉得这个东西相当鸡肋,不过在很多时候可以为懒人解决一些问题,我们先不管加进来,再加上当前Mouse的位置。Vector2D是一个由double x, double y组成的结构体。
struct CCTouch { int tapCount; Vector2D currentPos; };
在游戏开发中,我们经常要从A点跳到B点,假设当前坐标是B点,那么我们是否要去记录A点的坐标呢?有什么用?懒汉设计,估且加上,于是我们的结构变成了
struct CCTouch { int tapCount; Vector2D currentPos; Vector2D previousPos; }; 在Windows操作中,经常有个现象就是,我们在按钮上按下,但是没有立即响应单击事件,而是在我们抬起的时候,才响应单击事件,当然我们的iphone也要有这个功能,于是我们再增加两 个坐标,那就是按下坐标和抬起坐标。于是我们的结构变成了
struct CCTouch { int tapCount; Vector2D currentPos; Vector2D previousPos; Vector2D beginPos; Vector2D endPos; };



这样就行了吗?因为我们不是一层层回调,所以这个时候我们根本无法接收到抬起事件,但是我们的应用中又需要判断抬起事件,那么我们是不是得加上抬起的时间呢?好吧,我们加上,顺便把按下时间也记下来


struct CCTouch
{
int                tapCount;
Vector2D        currentPos;
Vector2D        previousPos;
Vector2D        beginPos;
Vector2D        endPos;
float                    beginTime;
float                    endTime;
};


似乎忘记了一件事情,如果是多点触摸,我怎么去找回我要用的那个点呢?是不是要给这个点一个名字呢?好吧,我们把这个触摸点的指针加上,于是我们的结构变成了


struct CCTouch { DWORD TouchPtr; int tapCount; Vector2D currentPos; Vector2D previousPos; Vector2D beginPos; Vector2D endPos; float beginTime; float endTime; };
应该可以了吧?呵呵,还不够,我们在存储的数据的时候可不想白白浪费内存去记录一些我不需要的数据或者已经没用多时的数据,那么我们是不是得加上一个参数来表示它是否已经被删除了呢?好吧,加吧都加上吧。


struct CCTouch { DWORD TouchPtr; int tapCount; Vector2D currentPos; Vector2D previousPos; Vector2D beginPos; Vector2D endPos; float beginTime; float endTime; bool isAlive; };
遇到一个情况,两个按钮叠加在一起的时候,我点击一下,两个都有响应这不是乱了吗?要不我再加了一个量用来记录这个点被使用的次数吧。最后结构就变成了


struct CCTouch
{
DWORD            TouchPtr;
int                tapCount;
int                usetime;
Vector2D        currentPos;
Vector2D        previousPos;
Vector2D        beginPos;
Vector2D        endPos;
float                    beginTime;
float                    endTime;
bool            isAlive;
};



iphone推荐touch点数上限5,我试过在6个点的时候,iphone会调用cancel事件,结果就是所有点都被cancel了,汗。。。
所以我们在引擎的core部分申请


CCTouch            m_Touch[TOUCH_MAXCOUNT];


TOUCH_MAXCOUNT在这里就是5啦。

呵呵,就这样,在这里我不会提供具体的代码,当然不表示我是想保留一些东西,其实剩下的工作很简单,你只要在iphone的touch事件中相应的记录数据释放数据然后再添加一些具体的功能就行啦。希望对你们有帮助。