UITapGestureRecognizer вызывается из неправильной сцены - PullRequest
1 голос
/ 13 февраля 2012

Как сделать распознаватели жестов доступными только из одной сцены?

У меня есть простое приложение cocos2d с двумя сценами.Я создаю UITapGestureRecognizer, например, в AppDelegate:

CCScene *gameScene = [GameLayer scene];
GameLayer *gameLayer = (GameLayer *) [gameScene.children objectAtIndex:0];

// Capture a tap
UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:gameLayer action:@selector(handleTapFrom:)] autorelease];
[tapRecognizer setDelegate:viewController];
[viewController.view addGestureRecognizer:tapRecognizer];

[[CCDirector sharedDirector] runWithScene:gameScene];

Это прекрасно работает, я получаю сенсорное событие, и все прекрасно.Тем не менее, я хочу переключиться на другую сцену для моего экрана паузы, что я делаю так:

    PauseMenuScene *pauseMenu = [PauseMenuScene node];
    [[CCDirector sharedDirector] replaceScene:pauseMenu];

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

Как мне предотвратить это?


После того, как andrewx подтвердил мое подозрение, я смог решить эту проблему,Я все еще не мог понять, как добавить UIGestureRecognizer в отдельные сцены, но вместо этого я отправил жесты непосредственно моему делегату, а затем распределял их в моих сценах.Вот фрагмент кода:

Создание распознавателя жестов в AppDelegate (изменено на прямое на себя):

UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)] autorelease];
[tapRecognizer setDelegate:viewController];
[viewController.view addGestureRecognizer:tapRecognizer];

Далее я убедился, что у меня фактически есть класс CCScene для моего основного класса (Я просто уходил от базового класса HelloWord, так что у него был только класс CCLayer).Этот класс выглядит так:

@implementation GameScene
@synthesize layer = _layer;

-(id) init
{
    if (self = [super init])
    {
        self.layer = [GameLayer node];
        [self addChild:_layer];
    }

    return self;
}

-(void) dealloc
{
    [_layer release];
    _layer = nil;
    [super dealloc];
}

@end

И, наконец, я делегировал отводы:

-(void) handleTapFrom: (UITapGestureRecognizer *) recognizer
{
    CCScene *currentScene = [[CCDirector sharedDirector] runningScene];

    if ([currentScene isKindOfClass:[GameScene class]])
    {
        GameLayer *gLayer = ((GameScene *) currentScene).layer;
        [gLayer handleTapFrom:recognizer];
    }
}

1 Ответ

1 голос
/ 13 февраля 2012

Ваш распознаватель жестов инициализируется с целью одной сцены, но когда вы replaceScene, эта цель больше не существует, верно? Итак, ваш распознаватель жестов пытается отправить прикосновения к слою, которого там нет. Я подозреваю, что это причина вашего крушения.

Я рекомендую добавить сенсорное управление к отдельным классам кокосов, чтобы каждая сцена могла обрабатывать прикосновения самостоятельно. Когда эта сцена выпущена и заменена другой, у нее также есть свои собственные распознаватели касания. Это гораздо безопаснее, чем добавлять сенсорные элементы управления в делегат приложения, что на самом деле не место (обычно) для этого типа логики, специфичной для сцены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...