Cocos2d: распознаватели жестов и CCMenu
Я следовал этому руководству по интеграции UIKit с CCLayer. По сути, все, что я хочу сделать, это добавить обработчики распознавания жестов в мой слой и запускать мои игровые действия в соответствии с ними.
Однако у меня есть проблема (которая не кажется новой), поскольку элементы CCMenu, которые я добавил в слой , не поглощают щелчки / нажатия.
Вкратце: у меня есть слой, в который я интегрировал весь код, предложенный Ray, и он отлично работает, за исключением того, что CCMenu не поглощает щелчки.
Я прочитал пост, но мне не совсем комфортно с идеей изменить CCNode и добавить метод, чтобы проверить, находится ли касание в пространстве и т. Д.
Я подумал, что более простым способом (для меня) было бы просто передать касание CCMenu, если касание находится над областью CCMenu.
Вот фрагмент кода:
- (void)handleTap:(UITapGestureRecognizer *)tapRecognizer{
UIView * view = [[CCDirector sharedDirector] view];
CGPoint point = [self convertYTouch:[tapRecognizer locationInView:view] ];
if (CGRectContainsPoint([pauseMenu boundingBox], point)) {
[myMenu HowDoIPassTheTouchToTheMenu]
}
else{
//Handle single tap
}
}
Любая идея о том, как я могу передать касание в меню?
Я пытался поиграть с TouchDispatcher и приоритетом, но не могу заставить его работать.
РЕДАКТИРОВАТЬ: я написал этот метод, но, похоже, не очень помогает
-(void) activateItemForTouch:(CGPoint)point
{
if( state_ != kCCMenuStateWaiting || !visible_ || ! enabled_)
return;
for( CCNode *c = self.parent; c != nil; c = c.parent )
if( c.visible == NO )
return;
CCLOG(@"in activate item for touch");
selectedItem_ = [self itemForTouchLocation:point];
[selectedItem_ selected];
[selectedItem_ unselected];
[selectedItem_ activate];
state_ = kCCMenuStateWaiting;
}
-(CCMenuItem *) itemForTouchLocation: (CGPoint) touchLocation
{
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
CCMenuItem* item;
CCARRAY_FOREACH(children_, item){
// ignore invisible and disabled items: issue #779, #866
if ( [item visible] && [item isEnabled] ) {
CGPoint local = [item convertToNodeSpace:touchLocation];
CGRect r = [item rect];
r.origin = CGPointZero;
if( CGRectContainsPoint( r, local ) )
return item;
}
}
return nil;
}
РЕДАКТИРОВАТЬ BIS:
Я также попытался реализовать протокол UIGestureRecognizerDelegate, но даже если я установил для gestRecognizer значение FALSE, он никогда не передает жест / прикосновение в меню.
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CCLOG(@"should receive");
return FALSE;
}