http://blog.chukong-inc.com/index.php/2012/02/26/cocos2d-touch/
问题描述:
在使用cocos2d做ui时,经常会遇到,需要弹出一个子界面,并且需要屏蔽下层界面的touch事件。而弹出框上某些区域,或者按钮可以响应touch事件。
解决方案步骤:
1> 给弹出框添加带吞噬能力的touch代理功能。
[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:kCCMenuHandlerPriority - 1 swallowsTouches:YES];
注意:a>:代理是会被retain的。所以使用完后务必要移出。
[[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];
b>:priority其值越小,越是会优先响应touch事件。这里使用kCCMenuTouchPriority - 1 既该界面的响应优先级比菜单按钮优先级低。
如果做模态对话框,只允许用户在当前对话框上做操作,也就是说要屏蔽对对话框下层按钮,菜单类的操作!基于这种特性,我们会遇到不知道将nPriority值注册为多少的困惑
(1)注册大于-128的值,根据响应事件的规则,对话框下层中的菜单的优先级别是-128,高于对话框的触摸响应级别,则先响应,这样便无法做到屏蔽对话框下层菜单的操作。
(2)注册小于等于-128的值,根据响应事件的规则,可以屏蔽对话框下层菜单的操作,但是问题来了,对话框层的菜单操作也将失效,这是源于cocos2d-x中CCMenu的机制,即所有的CCMenu对象的优先级都是-128。
2> 实现代理方法ccTouchBegan:返回YES表示吞噬touch事件,则其他代理都不收到该事件了。
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
return YES;
}
如果需要在某个区域内可以响应touch事件,则可以添加如下代码
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGRect aRect = CGRectMake(50, 50, 50, 50);
CGPoint touchpoint = [touch locationInView:[touch view]];
touchpoint = [[CCDirectorsharedDirector] convertToGL: touchpoint];
return !CGRectContainsPoint(aRect, touchpoint);
}
如果你希望除了菜单按钮以外的区域都不响应touch事件你也可以这样写:(假如我们的菜单是myMenu)
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
if ([myMenu itemForTouch:touch])
{
return NO;
}
returnYES;
}
注意:其中itemForTouch:方法的使用有点技巧,提示这个方法是CCMenu的私有方法
通过不喜欢编译时有一大堆警告,可以写一个方法代替itemForTouch