Как сделать распознаватели жестов доступными только из одной сцены?
У меня есть простое приложение 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];
}
}