这次来看一下Events处理.
还是跟HelloActions.h/m一样的处理, 放到MyFirstGame工程中后运行,可以看到随着tap位置的移动, 那个小人也跟着移动,如果是放到真机上运行,那个小人还会随着手机姿势的不同而旋转, 始终保持脑袋朝上的姿势.
Ok, 来看代码. 都文件没什么好看的, 简单的继承一个Layer类.
接着是init方法, Layer类有两个属性,分别是isTouchEnabled和isAccelerometerEnabled这两个属性分别控制该Layer是否相应touch事件和来自accelerometer的事件. 默认都是No. 在本例里面首先把这两个属性打开.
接下来加入一个Label, 还有一个Sprite, 比较不同的是这次用的不是addChild 方法, 而是addChild:z:tag:方法, 另外两个参数分别制定z轴的值和tag, tag值用来标示该sprite.
isTouchesEnabled 为YES使得以下StandardTouchDelegate delegate里面的方法生效:
-
- (BOOL)ccTouchesBegan:(NSMutableSet *)touches withEvent:(UIEvent *)event;
-
- (BOOL)ccTouchesMoved:(NSMutableSet *)touches withEvent:(UIEvent *)event;
-
- (BOOL)ccTouchesEnded:(NSMutableSet *)touches withEvent:(UIEvent *)event;
-
- (BOOL)ccTouchesCancelled:(NSMutableSet *)touches withEvent:(UIEvent *)event;
同样, isAccelerometerEnabled 设为YES也使得UIAccelerometerDelegate 生效, 不过这个delegate只有一个方法:
- - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration;
回顾一下HelloWord 里面的关于CocosNode的那张图就知道, 每个Layer都是继承自CocosNode并且遵守三个delegate, UIAccelerometerDelegate和StandardTouchDelegate就在包括在里面,这里只不过是使得这两个delegate生效了而已.
对touches的处理一如标准的tap事件处理,touches是一个NSSet类型,得到一个touch对象后有一点需要注意,这个touch的坐标是基于竖屏的坐标,而不是横屏,必须手动把他转成横屏的 ,幸亏Director对象已经提供了处理这个的方法convertCoordinate,然后就是得到那个小人的Sprite对象,执行stopAllActions 方法(如果你快速的在多个地方点击屏幕会发现那个小人会随着你点击的结束中止正在进行的动作转而执行新的动画), 接着是新的action,MoveTo,最后返回一个kEventHandled,来标示这个event已经被处理过了,不需要进入下一个event handler chain了. 否则, 如果没有处理这个event则应该返回一个kEventIgnored ,来通知chain里面的下一个handler来处理这个event.
接下来对accelerometer事件的处理主要是对两个属性进行操作,一个是rotation, 通过不停的计算来改变小人的角度达到让小人一直头朝上的目的.另一个很有意思的属性是scale, 通过这个属性和一些计算,可以达到这样的效果: 你越是用力的摇晃设备,小人的scale范围也就越大,放大缩小的效果很明显,这个语句虽然和简单,但是效果很酷!
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.