2014-12-04 99 views
2

我有一個Cat節點和一個Bird節點。鳥節點一起嵌套在稱爲birdBlock的容器節點中。一切都包含在WorldNode中。如果我給WorldNode添加一隻鳥,貓可以適當地與它互動,但是當鳥在鳥羣中時,貓只會將它們推開,然後它們會飛行。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

我不能得到這個工作,所以我剛剛給所有的鳥類一個physicsBody,並將檢測移動到didBeginContact

現在,無論他們的父母是什麼,我不nee 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在章節中清楚地解釋它在搜索節點樹

如果你有一個名爲@「節點」,那麼你可以通過把一個//名前通過所有後代搜索節點。所以你會搜索@「//節點」

試着改變你的不斷kBirdName等於@ 「// my_bird_name」

使用字符串文字就是一個例子 -

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

字面似乎不起作用,似乎打破了不在塊中的鳥。現在,貓派他們飛行,而不是執行我想要的互動。 – Siriss 2014-12-04 16:00:47

+0

巢中的鳥兒是否在街區中出現?另外,如果您檢測到框架交叉點,請確保這些矩形處於相同的節點座標空間中。 cat.frame是在我假設的場景座標中,但newBird.frame是在它的父母座標空間中,而不是場景(如果它在一個嵌套中)。在發生碰撞時,您可能還需要從父母身上移除該鳥,轉換位置並添加到場景中,具體取決於您想要的行爲。 – Bamsworld 2014-12-04 16:11:24

+0

你是什麼意思?當貓擊中他們時,他們是可見的並且飛行。我如何讓它們在同一個座標空間中? – Siriss 2014-12-04 17:06:51

相關問題