2

我有一个 Cat 节点和一个 Bird 节点。鸟节点嵌套在一个称为birdBlock 的容器节点中。一切都包含在 WorldNode 中。如果我将一只鸟添加到 WorldNode,Cat 可以与它​​进行适当的交互,但是当鸟在 birdBlock 中时,Cat 只是将它们推开,它们会飞起来。

我正在使用以下内容来查找我的鸟:

[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];
                }
            }
        }
}];

所以这也不起作用。如何更改精灵的坐标系?

4

2 回答 2

0

我无法让它工作,所以我只是给所有的鸟一个物理体,并将检测移动到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.
        }

    }
}
于 2014-12-07T18:37:36.247 回答
0

您可以通过多种方式搜索节点树。SKNode文档在Searching the Node Tree部分下清楚地解释了它。

如果您有一个名为@"node"的节点,那么您可以通过在名称前添加//来搜索所有后代。所以你会搜索@"//node"

尝试将常量kBirdName更改为等于@"//my_bird_name"

使用字符串文字的示例是 -

[worldNode enumerateChildNodesWithName:@"//nodeName" usingBlock:^(SKNode *node, BOOL *stop)
{ // Do stuff here... }
于 2014-12-04T15:45:48.107 回答