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 для сенсорной обработки, они не связаны.
Кроме того, подход с "сенсорной маской", вероятно, вернется и будет преследовать вас позже (например, если вы добавите другие объекты рядом с вашим меню прокрутки, которые также требуют прикосновения, касания будут замаскированы), было бы лучше, если бы все ваши объекты которые связаны с реализацией требований, связанных с касанием, инкапсулируют их собственную реализацию