【问题标题】:How To Remove a SKSpriteNode in didBeginContact如何在 didBeginContact 中删除 SKSpriteNode
【发布时间】:2015-02-18 22:04:25
【问题描述】:

如何在 didBeginContact 方法中删除 SKSpriteNode? 我将节点作为全局变量(节点:SKSpriteNode!),并在几个函数中更改了它的位置。但是,当它与另一个物体接触时,我想将其从屏幕上移除。我应该如何做到这一点?

 func didBeginContact(contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contactMask {
    case ColliderType.Star.rawValue | ColliderType.Cup.rawValue:
        println("")
    default:
        return

【问题讨论】:

    标签: swift ios8 sprite-kit


    【解决方案1】:

    我不明白你为什么在屏幕上有多个球时使用全局变量。

    如果球的categoryBitMaskbitMaskBall,您可以从父节点中删除传递给didBeginContact的联系人对象中的节点

    func didBeginContact(contact: SKPhysicsContact) {
    
        var ball : SKNode? = nil
        // Change it to categoryBitMask of the ball sprite
        if contact.bodyA.categoryBitMask == bitMaskBall &&  contact.bodyB.categoryBitMask == bottomBitMask { 
            ball = contact.bodyA.node
        }
        else if contact.bodyB.categoryBitMask == bitMaskBall && contact.bodyA.categoryBitMask == bottomBitMask {
            ball = contact.bodyB.node
        }
    
        ball?.removeFromParent()
    
    }
    

    条件使用球的categoryBitMask 检查接触中涉及的任何物体是否是球。然后我们提取碰撞体内部的节点,最后将其移除。

    【讨论】:

    • 谢谢!还有一个问题。假设我有一个收集这些球的杯子。所有这些都是二维的,因此杯子类似于倒置的梯形。梯形的底部(杯子的开口)是应该收集球的地方。那么,1. 有什么方法可以让球进入杯子的动画。 2. 我怎样才能做到只有当球与杯子的开口接触时它才会消失,而不是当它与杯子的其余部分接触时才消失。非常感谢您的帮助和时间!
    • 好的。这是一个复杂的问题,实际上应该是一个单独的问题。您应该在这里提出一个新问题,并将问题拆分为不太复杂的部分。
    • 你能看看我的新问题吗?
    【解决方案2】:

    只需使用removeFromParent() 方法将其从其父级中删除:

    sprite.removeFromParent()
    

    【讨论】:

    • 当我这样做时,它会删除下一个精灵,而不是那个正在联系的精灵。
    • 例如,如果我有一个球从天上掉下来,一个球撞到了地上,那么被移除的并不是撞到地面的球。这将是下一个从天而降的球。
    • @rakeshbs 我一次在屏幕上大约有 3-4 个球。 (它们以不同的 x 坐标每 0.5 秒生成一次)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多