Objective c 从错误的场景调用UITapgestureRecognitor
如何使手势识别器仅可从一个场景访问 我有一个简单的cocos2d应用程序,有两个场景。我在AppDelegate中创建了一个UIAPTgestureRecognitor,如下所示: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
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];
}
}