Не удается нажать SKSpriteNode - не обнаружено касаний ios

Я довольно новичок в iOS, цель C и работа с Xcode. Я сделал только одно простое приложение типа новостей, но теперь я хотел бы создать игру, которую я опубликовал на другой платформе.

По сути, у меня есть один объект, который появляется случайным образом, а затем исчезает, и цель состоит в том, чтобы нажать на объект, чтобы он исчез.

Однако я не могу коснуться объекта, даже если я установил mySKSpriteNode.userInteractionEnabled = YES;

Вот что у меня в моем touchesBegan метод:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */
    NSLog(@"Something was touched");
    UITouch *touch = [touches anyObject];
    NSLog(@"%@", touch);
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];
    if(node == mySKSpriteNode)
    [node runAction:[SKAction fadeOutWithDuration:0]];

}

В моем журнале я получаю это, когда я нажимаю на экран (не там, где у меня есть объекты):

2014-02-17 23:18:30.870 BubbleChallenge[48541:70b] Something was touched
2014-02-17 23:18:30.875 BubbleChallenge[48541:70b] <UITouch: 0x1130ea530> phase: Began tap count: 1 window: <UIWindow: 0x109c2ab60; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x109c274d0>; layer = <UIWindowLayer: 0x109c26810>> view: <SKView: 0x109c2e5e0; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CAEAGLLayer: 0x109c0e180>> location in window: {147.5, 128.5} previous location in window: {147.5, 128.5} location in view: {147.5, 128.5} previous location in view: {147.5, 128.5}

Когда я касаюсь mySKSpriteNode, я ничего не получаю в журнале, даже "Что-то было затронуто";

Есть идеи, почему это может происходить?

Другие вопросы, которые я нашел, сказали, что ответ должен установить userInteractionEnabled = YES.... может быть, есть определенный пункт в коде, где я должен установить это?..

Вся помощь приветствуется!

4 ответа

Решение

Вы пытались установить name собственность вашего спритенода?

В вашей инициализации для mySKSpriteNode:

mySKSpriteNode = [[SKSpriteNode alloc] initWithTexture:sometexture];
mySKSpriteNode.name = @"thisIsMySprite"; // set the name for your sprite
mySKSpriteNode.userInteractionEnabled = NO; // userInteractionEnabled should be disabled

Затем:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];
    if ([node.name isEqualToString:@"thisIsMySprite"]) {
        NSLog(@"mySKSpriteNode was touched!");
        [node runAction:[SKAction fadeOutWithDuration:0]];
    }
}

Ваш код по сути правильный. Требуется всего несколько небольших изменений.

Вы реализовали -touchesBegan: метод в вашем классе сцены. Если вы хотите обрабатывать касания внутри класса сцены, то все дочерние узлы должны иметь userInteractionEnabled свойство установлено в NO, Спрайтовый узел userInteractionEnabled свойство должно быть установлено в YES только когда он способен обрабатывать прикосновения самостоятельно.

Итак, в вашем случае вы должны внести следующие изменения:

1 - Установите для userInteraction spriteNode значение NO.

mySKSpriteNode.userInteractionEnabled = NO;

2 - Измените способ проверки своего спрайта.

if([node isEqual: mySKSpriteNode])

Вы обнаружите, что ваш код работает как задумано.

В Swift 2.0!

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

  let touch = touches.first!
  let location = touch.locationInNode(self)
  let node = self.nodeAtPoint(location)

  if node.name == "spriteName" {
    // Present new game scene
  }
}

Я никогда не использовал фреймворк SKSprite, но постараюсь помочь. Во-первых, ваша функция "-(void)touchesBegan:(NSSet *) затрагивает событие withEvent:(UIEvent *)" должна быть установлена ​​в вашем пользовательском классе SKSpriteNode, если нет, то это нормально, если это не работает.

Если это уже сделано, вам нужно выполнить поиск, где указатель является ручкой (другим объектом), тогда вы можете использовать: "- (BOOL)gestRecognizer: (UIPanGestureRecognizer )

надеюсь, что это поможет!

Другие вопросы по тегам