1

我有一个完整的画布 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);
}

在这种情况下,唯一的区别是我只触发了 1 个侦听器——总是我定义的最后一个侦听器——而且无论触摸发生在哪里。

在我看来,问题不在于事件委托,而在于 CCLayer 边界。这就是我设置大小的方式:

self.contentSize = CGSizeMake(10.0f, 10.0f);

你知道我哪里出错了吗?也许我错过了一些重要的东西。

谢谢!

4

2 回答 2

1

我强烈建议您在需要可点击按钮时使用CCMenu 。它们touchEvents为您处理,因此您只需要关心定义一个callBack函数。这是一个很好的教程。-

http://www.raywenderlich.com/414/cocos2d-buttons-tutorial-for-ios-how-to-create-buttons-in-cocos2d-simple-radio-and-toggle

于 2013-10-03T07:57:04.673 回答
1

它实际上取决于层层次结构,因为所有触摸最终都会到达已注册的节点。

但是为了省去你弄乱这个的麻烦,你可以使用CCMenuCCMenuItem类轻松地实现你的按钮。

例如 :

 // 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];

有了这个,您将不再需要微小的层。只需将菜单添加到画布层,不要忘记将其菜单项位置设置为正确布局。

于 2013-10-03T07:57:56.657 回答