为什么在Sprite Kit中只从父级中删除了一些节点?

时间:2014-12-20 04:37:37

标签: sprite-kit removechild

所以我使用didBeginContact方法使用下面的代码块检测项目符号的物理实体与场景中其他对象之间的碰撞:

-(void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (WWPhysicsCategoryOther | WWPhysicsCategoryBullet)) {
        [_bullet removeFromParent]
    }
}

当屏幕上有一颗子弹时,子弹被移除。然而,像许多射击游戏一样,玩家可以重复射击子弹。我发现当屏幕上有多个子弹时,并不是所有子弹都在接触后被移除。如何确保碰撞后立即清除每颗子弹?

1 个答案:

答案 0 :(得分:1)

0x141E和ZeMoon评论是正确的。

_bullet可能是指向特定节点的指针,因此,在碰撞检测时,碰撞的子弹节点可能并不总是具有指针的那个(这意味着可能是碰撞发生时,其他一些子弹屏幕正在删除)。

更好,更“正确”的做法是,在didBeginContact:上确定哪个联系人是子弹,并使用其node属性,将其从其父级中删除。

以下示例中的某些内容应该起作用 -

-(void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (WWPhysicsCategoryOther | WWPhysicsCategoryBullet)) {  

        SKNode *bulletNode = (contact.bodyA.categoryBitMask == WWPhysicsCategoryBullt) ? contact.bodyA.node : contact.bodyB.node;

        [bulletNode removeFromParent]
    }
}