Objective c 从错误的场景调用UITapgestureRecognitor

Objective c 从错误的场景调用UITapgestureRecognitor,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,如何使手势识别器仅可从一个场景访问 我有一个简单的cocos2d应用程序,有两个场景。我在AppDelegate中创建了一个UIAPTgestureRecognitor,如下所示: CCScene *gameScene = [GameLayer scene]; GameLayer *gameLayer = (GameLayer *) [gameScene.children objectAtIndex:0]; // Capture a tap UITapGestureRecognizer *ta

如何使手势识别器仅可从一个场景访问

我有一个简单的cocos2d应用程序,有两个场景。我在AppDelegate中创建了一个UIAPTgestureRecognitor,如下所示:

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];
然而,当那个场景启动时,如果我触摸到它的任何地方,它就会崩溃。这似乎是因为触摸将进入游戏场景,而游戏场景处于停滞状态

我如何防止这种情况


在andrewx证实了我的怀疑之后,我终于解决了这个问题。我仍然不知道如何将UIGestureRecognitors添加到各个场景中,但我所做的是直接将手势发送给我的代理,然后让它将它们解析到我的场景中。下面是一个片段:

在AppDelegate中创建手势识别器(更改为直接到自身):

接下来,我确保我的主类实际上有一个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];
    }
}

您的手势识别器使用一个场景的目标进行初始化,但是当您
replaceSecene
时,该目标不再存在,对吗?因此,您的手势识别器试图将触摸发送到不存在的层。我怀疑这就是你坠机的原因


我建议将您的触摸控制添加到各个cocos类中,这样每个场景都可以自己处理触摸。当该场景被释放并替换为另一个场景时,它也有自己的触摸识别器。这比向应用程序代理添加触摸控制要安全得多,因为应用程序代理实际上(通常)不是这种场景特定逻辑的位置。

您的手势识别器使用一个场景的目标进行初始化,但是当您
替换场景时,该目标不再存在,对吗?因此,您的手势识别器试图将触摸发送到不存在的层。我怀疑这就是你坠机的原因

我建议将您的触摸控制添加到各个cocos类中,这样每个场景都可以自己处理触摸。当该场景被释放并替换为另一个场景时,它也有自己的触摸识别器。这比向应用程序代理添加触摸控制要安全得多,因为应用程序代理实际上(通常)不适合这种场景特定的逻辑

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

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