2014-08-28 3 views
1

У меня есть классический SKScene с некоторыми кнопками (все программно) и ViewController для этой сцены. Где должны быть затронуты события - в SKScene или в ViewController. Мне нужно переключиться на другие сцены и другие контроллеры представлений при касании разных кнопок с помощью push segue. Когда я обрабатываю события событий в контроллере вида, он возвращает мне ноль для касания SKNode. Вот мой код в поле зрения контроллера (сцена является его собственностью):касается * событий - SKScene vs. ViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self.scene]; 
    SKNode *node = [self.scene nodeAtPoint:location]; 
    if ([node.name isEqual: @"campaign"]) { 
     CampaignViewController *levelViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CampaignScene"]; 
     [self.navigationController pushViewController:levelViewController animated:NO]; 
    } 
} 

Благодарим вас за разъяснение.

ответ

4

Реализация сенсорных делегатов в ViewController не может привести вас к узлам, так как именно SKScene управляет ими. Следовательно, чтобы иметь возможность использовать nodeAtPoint:, вам необходимо реализовать делегатов touch в самой SKScene.

Теперь вам также необходимо, чтобы SKScene связывался с UIViewController и передавал сообщения, которые будут вызывать segues или другие методы. Для этого вы можете использовать делегацию или NSNotificationCenter, реализация которой продемонстрирована в этом answer.

После реализации либо из вариантов ответа, ваш код должен выглядеть следующим образом:

//In ViewController.m 

-(void) presentCampaignVieController 
{ 
    CampaignViewController *levelViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CampaignScene"]; 
    [self.navigationController pushViewController:levelViewController animated:NO]; 
} 

//In SKScene.m (Using Delegation) 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self.scene]; 
    SKNode *node = [self.scene nodeAtPoint:location]; 
    if ([node.name isEqual: @"campaign"]) { 
     [self.delegate presentCampaignVieController]; 
    } 
} 

Для того, чтобы вызвать тот же метод в ViewController с помощью NSNotificationCenter, вы сначала должны добавить наблюдатель:

//ViewController.m, under viewDidLoad 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentCampaignVieController) name:@"gotoCampaign" object:nil]; 

//In SKScene.m (Using NSNotificationCenter) 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self.scene]; 
    SKNode *node = [self.scene nodeAtPoint:location]; 
    if ([node.name isEqual: @"campaign"]) 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"gotoCampaign" object:nil]; 
    } 
} 
+0

спасибо! – Baerdon

Смежные вопросы