我有一个完整的画布CCLayer,上面有几个小CCLayer - 它们是按钮。在按钮上我启用了触控侦听器:
- (id)init {
if ((self = [super init])) {
[self setTouchEnabled:YES];
}
return self;
}
首先我尝试了默认的触控处理程序:
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"This is me: %d", self->button_id);
}
奇怪的结果是无论我触摸它的地方总是触发所有按钮触摸处理程序,即使我触摸一个干净的区域,也不应该调用任何东西。
我正在阅读文档和博客,但似乎没有什么是直接的解决方案。我还通过添加:
尝试了单点触控处理程序- (void)onEnterTransitionDidFinish {
[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES];
}
- (void)onExit {
[[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
}
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"This is me: %d", self->button_id);
}
这种情况唯一的区别是我只触发了一个侦听器 - 总是我定义的最后一个 - 再次,无论触摸发生在哪里。
在我看来,问题不是事件委托,而是CCLayer的界限。这是我设置大小的方式:
self.contentSize = CGSizeMake(10.0f, 10.0f);
你有错误的想法吗?也许我错过了一些必要的东西。
谢谢!
答案 0 :(得分:1)
我强烈建议您在需要可点击按钮时使用CCMenu。他们为您处理touchEvents
,因此您只需关注定义callBack
函数。这是一个很好的教程.-
答案 1 :(得分:1)
这实际上取决于层次结构,因为所有触摸最终都会到达注册节点。
但为了省去麻烦,您可以使用CCMenu
和CCMenuItem
类轻松实现按钮。
例如:
// Create a menu item with action method (when pressed)
CCMenuItemImage *buttonItem= [CCMenuItemImage itemFromNormalImage:@"button1.png" selectedImage:@"button1.png" target:self selector:@selector(button1Pressed:)];
// Create a menu with the menu item and add it to your canvas layer
CCMenu *menu= [CCMenu menuWithItems:buttonItem, nil];
[self addChild:menu];
这样你就不再需要这么小的层了。只需将菜单添加到画布图层,不要忘记将其菜单项位置设置为正确布局。