cocos2d-屏蔽touch事件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值