2014-12-04 2 views
2

У меня есть узел Cat и узел Bird. Узлы птиц вложены вместе в контейнерный узел, называемый birdBlock. Все содержится в WorldNode. Если я добавлю птицу к WorldNode, кошка может взаимодействовать с ней соответствующим образом, но когда птицы будут в birdBlock, Кошка просто сбрасывает их с пути, и они улетают.SpriteKit - обнаружить, если узел попадает в другие дочерние узлы и выполняет действие

Я использую следующий, чтобы найти мои птица:

[worldNode enumerateChildNodesWithName:kBirdName usingBlock:^(SKNode *node, BOOL *stop) 
{ 
    SKSpriteNode *newBird = (SKSpriteNode *)node; 
    if (CGRectIntersectsRect(newBird.frame,cat.frame)) 
    { 
     //Do Something 
     //This is never reached when the birds are in the SKSpriteNode birdBlock. 
     //They just get shoved all over the screen. 
    } 
}]; 

птицы в блоке имеет правильное имя.

Теперь они перечисляются, но все же не взаимодействуют с кошкой, кроме полета по экрану.

Теперь я делаю это:

[[worldNode children] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
     SKSpriteNode *blockNode = (SKSpriteNode *)obj; 
     if ([blockNode.name isEqualToString:kBirdBlockName]) 
     { 
      [blockNode enumerateChildNodesWithName:kBirdName usingBlock:^(SKNode *node, BOOL *stop) 
      { 
       SKSpriteNode *nbird = (SKSpriteNode *)node; 
       NSLog(@"FOUND BIRDS HERE"); 

       //THIS IS FOUND! But below still does not work 

       if (CGRectIntersectsRect(nbird.frame, cat.frame)) 
       { 
        NSLog(@"Hit BIRD"); 
        [nbird removeFromParent]; 
       } 
      } 
     } 
}]; 

Так что это не работает. Как изменить систему координат спрайта?

ответ

0

я не мог получить эту работу, так Я просто дал всем птицам физическое тело и перевел обнаружение на didBeginContact

Теперь не имеет значения, что их родитель, и я не люблю d беспокоиться об изменении координат.

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKSpriteNode *firstNode = (SKSpriteNode *)contact.bodyA.node; 
    SKSpriteNode *secondNode = (SKSpriteNode *) contact.bodyB.node; 
    if ((firstNode.physicsBody.categoryBitMask == catCategory && secondNode.physicsBody.categoryBitMask == birdCategory) || (firstNode.physicsBody.categoryBitMask == birdCategory && secondNode.physicsBody.categoryBitMask == catCategory)) 
    { 
     NSLog(@"DID HIT BIRD"); 
     if (firstNode.physicsBody.categoryBitMask == catCategory) { 
      //do something to secondNode. 
     } 
     if (firstNode.physicsBody.categoryBitMask == birdCategory) { 
      //do something to firstNode. 
     } 

    } 
} 
1

Вы можете искать дерево узлов разными способами. SKNode documentation ясно объясняет это в разделе Поиск дерева узлов.

Если у вас есть узел с именем @ «узел» то вы можете найти все потомок, поставив // перед именем. Таким образом, вы бы искали @ "// node".

Попробуйте изменить постоянную kBirdName равным @ "// my_bird_name"

Пример использования строкового литерала бы -

[worldNode enumerateChildNodesWithName:@"//nodeName" usingBlock:^(SKNode *node, BOOL *stop) 
{ // Do stuff here... } 
+0

Литерал, похоже, не работает и, похоже, разбивает птиц, которые также не находятся в блоке. Теперь кошка отправляет их всем, вместо того, чтобы выполнять взаимодействие, которое я хочу. – Siriss

+0

Возникают ли птицы в гнезде в блоке? Также там, где вы обнаруживаете пересечение фреймов, убедитесь, что прямоугольники находятся в одном и том же координатном пространстве узлов. cat.frame находится в координатах сцены, которые я принимаю, но newBird.frame находится в родительском координате пространства, которое не является сценой (если оно находится в гнезде). При столкновении вам также может потребоваться удалить птицу из родителя, преобразовать позицию и добавить к сцене, в зависимости от того, какое поведение вы хотите. – Bamsworld

+0

Что ты имеешь в виду? Они видны и летают, когда Кошка бьет их. Как сделать их в одном и том же координатном пространстве? – Siriss