CCLayer调整触摸区域的大小 接受触摸事件 调整优先级等的理解

(转载请注明出处,谢谢:http://www.cnblogs.com/binxindoudou/archive/2013/04/25/3042454.html

      原来一直就对这个CCLayer的使用不够清楚,尤其是对其事件的处理方面,害怕研究起来麻烦,凑活着实现就好了,可是这样带来的后果就是每回都会麻烦,相当耗时间(让我想起来一句俗语:人骗地一天,地骗人一年,好像有所以"种地"还是踏踏实实的好)。所以这回就花了些时间研究了一下,终于认为能够解决一般涉及到的CCLayer的问题了,就赶紧的做个小笔记,防止以后再忘记。其中有不对的地方,还望各位多多指教。

1.CCLayer调整触摸域

      我曾经试过使用CCLayer中的-(void) setContentSize: (CGSize) size这个方法去调整CCLayer的大小,以为这样就可以调整触摸域,但是没有效果。因为这个CCLayer是无法调整大小的,它的大小是整个场景的大小。如果你点进入.m中去看的话,会发现这个方法是调整CCLayerColor的大小,即显示区域的大小。

  所以这个调整大小不通,我就这能控制触摸响应区域了,这个奏效了。举个例子,见下图:

在场景上我添加了一个接收触摸层,让后我想让这个触摸层覆盖的那些按钮不可响应事件,而在旁边的1-6个按钮可以响应。于是我就调整大小,失败。使用吞没事件,虽然身下的按钮不能响应了,但是1-6也响应不了了(这也间接的说明,CCLayer的大小就是整个场景的大小)。

处理方法:

步骤一:设置接收触摸层的响应事件优先级为最高,并且吞没事件处理(这个特别重要,如果不吞没,那么身下的按钮也可以响应,可以试试看)

步骤二:重写

 1 - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
 2 {  
 3     //控制触摸区域
 4   //获取触摸点
 5     CGPoint touchPoint = [touch locationInView:[touch view]];
 6     touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint];
 7 
 8   //判断触摸点是否在该控制区域内CGRectMake(0, 30, 440, 290)
 9     if(!CGRectContainsPoint(CGRectMake(0, 30, 440, 290),touchPoint))//该CGRectMake()数据是针对上边示意图大概估计的数,随着实际情况而定
10     {
11         return NO;//不在区域内返回NO,该接收触摸层就不会接收这个触摸事件,并且往下传,也就是那个事件吞没就失效了,那么1-6按钮可以响应
12     }
13     returnYES;//返回YES接收这个触摸事件,并且不再往下传播,本层处理,那么被覆盖的按钮就不会响应
14 }

  完成以上工作后,那么就可以实现预想的效果了。

2.CCLayer吞噬触摸事件

  首先,layer要可接受触摸:layer.isTouchEnabled = YES;

  然后,layer吞没事件:[[[CCDirectorsharedDirector] touchDispatcher] addTargetedDelegate:layer priority:priorityYouWant swallowsTouches:YES]; 

(转载请注明出处,谢谢:http://www.cnblogs.com/binxindoudou/archive/2013/04/25/3042454.html) 

3.CCLayer在默认状态不可调节锚点,containerStartLayer.ignoreAnchorPointForPosition = YES;之后调整锚点有效

4.CCLayer虽然触摸区域没有大小,但是存在锚点和位置,是这个层相对与父类节点的的锚点和位置,然后触摸区域无限延伸,与场景的大小一致

posted @ 2013-04-25 14:14 彬心典登 阅读(...) 评论(...) 编辑 收藏