2014-12-04 6 views
2

고양이 노드와 새 노드가 있습니다. 새 노드는 birdBlock이라는 컨테이너 노드에 함께 중첩됩니다. 모든 것이 WorldNode에 포함되어 있습니다. WorldNode에 새를 추가하면 Cat이 적절하게 상호 작용할 수 있지만 새가 birdBlock에있을 때 Cat은 길을 막 빗나가고 날아갑니다.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
내가이 작업을 얻을 수 없었다

-

는 "// my_bird_name"

예 것 리터럴 문자열을 사용하여 @을 동일하게하여 일정 kBirdName을 변경해보십시오 방금 모든 새들에게 육체를주었습니다. 몸체를 감지기로 옮겼습니다. didBeginContact

이제 부모님이 무엇인지는 중요하지 않습니다. 좌표를 바꾸는 것에 대해 걱정할 필요가 없습니다.

- (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"을 검색하십시오. 그래서,

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

리터럴이 작동하지 않는 것처럼 보일뿐 아니라 블록에없는 새도 깨지기 쉬운 것 같습니다. 이제 고양이는 내가 원하는 상호 작용을 수행하는 대신 모든 비행을 보냅니다. – Siriss

+0

블록에서 새가 둥지를 틀고 있습니까? 또한 프레임 교차점을 감지하는 곳에서 rect가 동일한 노드 좌표 공간에 있는지 확인하십시오. cat.frame은 장면 좌표에 있다고 가정하고 있지만 newBird.frame은 장면이 아닌 부모 좌표 공간에 있습니다 (둥지에있는 경우). 충돌이 발생하면 부모에게서 새를 제거하고 원하는 위치로 전환하고 위치에 추가해야 할 수도 있습니다. – Bamsworld

+0

위로 올라가는 것은 무엇을 의미합니까? 그들은 눈에 보이고 고양이가 그들을 때리면 날으십시오. 같은 좌표 공간에서 어떻게 만들 수 있습니까? – Siriss

관련 문제