从本章开始,我们开始讲解Cocos2d-iPhone引擎的用户输入处理机制(User Input),也称为事件响应机制(Event-handle)。iPhone上用户的输入有两种:触摸输入(Touch)和运动感知(Accelerometer),本章的重点是前者。
交互性是游戏与传统艺术(文学、音乐、电影…)之间最大的差别,设计良好的游戏首先就是要让用户获得良好的操作体验。魔兽世界绚丽多彩的世界又吸引了千万玩家多少的注意力呢?Wower的大多数时间不都是在忙碌的跑路、打怪、采集和交易中度过的么?因此,直接、便捷、精心设计的交互是一个成功游戏的关键。
iPhone上的多点并发触摸输入是我们之前在PC上没有遇到的,为此iPhone OS的编程接口提供了一个集合类((NSSet *)touches)来传递用户当前的输入。如何解析这个类,并正确的做出反应是本章的第一部分要解决的问题。
基于iPhone OS的事件相应模式, Cocos-2D-iPhone引擎又是如何将用户的输入传递到每一个Layer中,并允许程序按照什么样的既定的规则来处理的呢?从0.8.0开始,使用Targeted touch的触摸处理模式是系统的推荐模式,这种模式帮助程序员分解了(NSSet *)touches提供的信息,并提供了有针对性的层响应分发机制。这是本章第二部分要重点讲解的内容。
本章最后提供了一个比较完整的触摸处理示例。
在开始介绍iPhone OS的4个触摸响应事件之前,我们首先学习一下Cocoa 基类库提供的集合类:NSSet和该类的派生类NSMutableSet。iPhone OS通过NSSet传递硬件传感器传来的各种组合触摸信息。
iPhone OS提供了关于触摸(Touch)的以下4个事件响应函数:
l (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}
l (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}
l (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}
l (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}
以上依次表示手指触摸、移动(手指未抬起)、手指抬起、取消。每一个UIView对象都会接收到系统触发的上述4个事件。
以上4个事件的处理函数框架基本都是一样的:
1) 获取所有触摸信息。
可以直接使用 touches参数:
NSMutableSet *mutableTouches = [touches mutableCopy];
也可以通过 event参数获得:
NSSet *allTouches = [event allTouches];
2) 依次处理每一个触摸点
通过[allTouches count]来判断是多触点还是单触点,获取第一个触摸点方法:
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
获取第二个触摸点:
UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1];
第三、第四…多点触摸以此类推。
3) 针对每个触摸点的处理
通过以下函数考察每个触摸点是单击还是双击:
[touch tapCount]