【问题标题】:SpriteKit - Detect if node hits another nodes children and perform actionSpriteKit - 检测节点是否命中另一个节点子节点并执行操作
【发布时间】:2014-12-04 15:31:16
【问题描述】:

我有一个 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];
                }
            }
        }
}];

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

【问题讨论】:

    标签: ios sprite-kit skspritenode sknode


    【解决方案1】:

    您可以通过多种方式搜索节点树。 SKNode documentation搜索节点树部分清楚地解释了它。

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

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

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

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

    【讨论】:

    • 文字似乎不起作用,并且似乎也破坏了不在块中的鸟类。现在猫让它们全部飞起来,而不是执行我想要的交互。
    • 巢里的鸟儿在街区里出现了吗?此外,在您检测框架交叉点的地方,请确保矩形位于相同的节点坐标空间中。 cat.frame 在我假设的场景坐标中,但 newBird.frame 在其父坐标空间中,而不是场景(如果它在嵌套中)。发生碰撞时,您可能还需要从父级中移除小鸟,转换位置并添加到场景中,具体取决于您想要的行为。
    • 出现是什么意思?当猫击中它们时,它们是可见的并且会飞起来。如何让它们在同一个坐标空间中?
    • 抱歉有任何混淆 - 我的意思是在代码中出现的所有鸟节点现在都从您发布的方法中发现并通过 SKNode *node 参数传递到块中。 SKNode 有几种方法可以将坐标转换为其他节点的坐标。使用的方法是 convertPoint:fromNode: 和 convertPoint:toNode:
    • 未枚举鸟类。如何枚举孩子的孩子?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多