CCLayer UIGestureRecognizer и HUD

Привет, товарищи разработчики игры cocos2d, у меня простая проблема

Я внедряю CCScene с двумя слоями CCLay, один из которых - игра, а другой - HUD, реализованный следующим образом:

+ (CCScene *)scene {
    CCScene *scene = [CCScene node];
    LevelLayer *layer = [LevelLayer node];
    LevelHUDLayer *hud = [LevelHUDLayer node];
    layer = [layer init];

    [layer setHUDLayer:hud];
    [hud setParentLevel:layer];

    [scene addChild:hud z:HUD_ZLevel];
    [scene addChild:layer];

    return scene;
}

И это прекрасно работает. У меня также есть UIPinchGestureRecognizer, который я реализую так:

- (void)onEnterTransitionDidFinish {
    pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(makePinch:)];
    [[CCDirector sharedDirector].view addGestureRecognizer:pinch];
}

А потом я улавливаю жесты позже в коде так:

self.scale = pinch.scale;

Это работает безупречно, КРОМЕ я хочу убедиться, что только игровой слой воспринимает жесты, а не HUDLayer. Прямо сейчас прикосновение к элементам управления HUDLayer и попытка переместить персонажа на экране вызывает масштабирование уровня, это довольно раздражает.

Поэтому мой вопрос заключается в том, как мне назначить ТОЛЬКО уровень-слой, чтобы выбрать распознаватель жестов? Я думаю, что это было бы легко сделать, если бы я мог получить доступ к UIView CCLayer, но кажется, что я могу получить доступ только к CCDirector.sharedDirector.view

Спасибо заранее!

1 ответ

Вы не можете получить доступ к представлению CCLayer по одной простой причине: он не существует. Вся логика cocos2d выполнена в едином представлении openGL.

Чтобы ограничить область распознавания жестов, вы можете реализовать метод делегата gestureRecognizerShouldBegin:, Там вы можете проверить позиции касаний и вернуться NO если они над вашим HUD, а не игровым слоем.

Другой способ - реализовать собственный распознаватель жестов с помощью CCTouchDispatcher от cocos2d.

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