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;
}

0 ответов

Другие вопросы по тегам