CCMenuAdvanced нажимают, даже если над ним есть спрайт

В моей игре Cocos2d 2.0 для iOS я использую CCMenuAdvanced для создания меню прокрутки. Проблема в том, что невидимая часть меню также, кажется, обрабатывает прикосновения.

Вот код (необходимый для правильного отображения и обрезки borderRect):

// background is full screen, with all pixels transparent 
// except the part where menu shows
CCSprite *menuBackground = [CCSprite spriteWithFile:@"scrollingmenubackground.png"];
//...
[self addChild:menuBackground];
//...    
//create menu items
CCMenuAdvanced *settingsMenu = [CCMenuAdvanced menuWithItems:item1, item2, item3, nil];
//...
[menuBackground addChild:settingsMenu];

// foreground is full screen, with an image    
// with a transparent hole where the menu shows
CCSprite *foreground = [CCSprite spriteWithFile:@"scrollingmenuforeground.png"];    
[menuBackground addChild:foreground];
//...

Теперь это работает нормально, и меню отображается, правильно обрезается и обрабатывает прикосновения. Однако проблема в том, что когда я нажимаю под видимым меню, оно все равно обрабатывает касания в меню, даже если впереди есть спрайт с непрозрачными пикселями (foreground).

Я попытался поиграть с zorder, установив передний план с более высоким zorder, чем в меню, но это, похоже, ничего не меняет.

    menuBackground.zOrder = 1;
    settingsMenu.zOrder = 2;
    foreground.zOrder = 3;

Я также попытался установить приоритет меню INT_MIN так же как kCCMenuHandlerPriority - 1, но без эффекта.

Как заставить меню отвечать только в той части, которая видна пользователю?

Спасибо ананд

1 ответ

Решение

Чтобы иметь эффективную "маску", вы должны использовать слой с сенсорным экраном в качестве переднего плана. В этом слое вы можете принимать прикосновения за пределами меню, ничего не делать с ними и передавать их внутри маски. Однако это вызовет проблемы: если touchBegan внутри маски, а пользователь тащит палец наружу, меню все равно будет продолжать прокручиваться. Вы можете либо создать подкласс CCAdvancedMenu, чтобы реализовать свои собственные требования к сенсорной обработке, либо создать свою собственную версию. Я закончил тем, что делал последнее, потому что мой гейм-дизайнер хотел от него много других функций, и создание подклассов стало помехой, а не помощью. Кстати, не полагайтесь на zOrder для сенсорной обработки, они не связаны.

Кроме того, подход с "сенсорной маской", вероятно, вернется и будет преследовать вас позже (например, если вы добавите другие объекты рядом с вашим меню прокрутки, которые также требуют прикосновения, касания будут замаскированы), было бы лучше, если бы все ваши объекты которые связаны с реализацией требований, связанных с касанием, инкапсулируют их собственную реализацию

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