【问题标题】:removeFromParent() Doesn't Work in SpriteKitremoveFromParent() 在 SpriteKit 中不起作用
【发布时间】:2015-07-01 04:51:37
【问题描述】:

我的 SpriteKit 游戏中有一个循环,它随机生成一个对象的副本,我想使用 removeFromParent() 在接触时删除我的对象。但是,当我将其添加到代码中时,不会删除该对象。这是生成对象的循环代码:

for i = 0; i<1000; ++i {
        var randomNumber = CGFloat(arc4random_uniform(3000)) * 200
        bubbleDuplicate.position = (CGPointMake(randomNumber, 400))
        bubbleDuplicate = bubble.copy() as! SKSpriteNode
        bubbleDuplicate.physicsBody?.categoryBitMask = bubbleCategory
        bubbleDuplicate.physicsBody?.collisionBitMask = 0
        bubbleDuplicate.physicsBody?.contactTestBitMask = 0

        addChild(bubbleDuplicate)

        func BubbleContact(){
            bubbleDuplicate.removeFromParent()
            bubble.removeFromParent()
            bubbleDuplicate.setScale(0)
            bubble.setScale(0)

        }

    }

这是我应该删除我的对象的碰撞代码:

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

    if collision == (playerCategory | crateCategory) {

        gameOver()
    }
    if collision == (playerCategory | bubbleCategory) {
        NSLog("Bubble Contact")
        bubbleDuplicate.removeAllActions()
        bubbleDuplicate.removeFromParent()
        bubble.removeAllActions()
        bubble.removeFromParent()
        bubbleDuplicate.setScale(0)
        bubble.setScale(0)
        bubbleDuplicate.alpha = 0
        bubble.removeFromParent()
        bubbleDuplicate.removeFromParent()

               }


}

如何修复我的代码?

编辑:感谢@NikitaLeonov 的回答,我的泡泡精灵现在可以正常运行了。但是,我正在尝试将相同的功能应用于另一个精灵节点,并且简单地复制他的代码不会产生相同的效果。我该怎么办?这是新代码:

if (contact.bodyA.categoryBitMask == bubbleCategory) {
        let node = contact.bodyB.node
        //Other remove routine
        NSLog("Bubble Contact")
        node?.removeAllActions()
        node?.removeFromParent()
    } else if (contact.bodyB.categoryBitMask == bubbleCategory) {
        let node = contact.bodyB.node
        //Other remove routine
        NSLog("Bubble Contact")
        node?.removeAllActions()
        node?.removeFromParent()
    }else if (contact.bodyA.categoryBitMask == wormCategory) {
        let node = contact.bodyB.node
        //Other remove routine
        NSLog("Worm Contact")
        node?.removeAllActions()
        node?.removeFromParent()
    }else if (contact.bodyB.categoryBitMask == wormCategory) {
        let node = contact.bodyB.node
        //Other remove routine
        NSLog("Worm Contact")
        node?.removeAllActions()
        node?.removeFromParent()
    }

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    您使用bubbleDuplicate 和bubble 作为全局变量并对它们调用removeFromParent,所以只有最后生成的bubble 和bubbleDuplicate 会被移除。如您所见,这不是正确的方法。您应该在联系方法中获取需要从contact.bodyA 和contact.bodyB 变量中删除的节点。

    func didBeginContact(contact: SKPhysicsContact) {
        let collision:UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)
    
        if collision == (playerCategory | crateCategory) {
            gameOver()
        }
    
        if (contact.bodyA.categoryBitMask == bubbleCategory) {
          let node = contact.bodyA.node
          //Other remove routine
          node.removeAllActions() 
          node.removeFromParent()
        } else if (contact.bodyB.categoryBitMask == bubbleCategory) {
          let node = contact.bodyB.node
          //Other remove routine
          node.removeAllActions() 
          node.removeFromParent()
        }
    }
    

    另外,如果bubble 和bubbleDouble 以某种方式相关,我会尝试设置一个带有子节点的系统,但不会在联系方法中单独管理它们。我也建议将删除操作作为简化所有管理的操作。因此,除了与代码重复的明显斗争之外,还有很多改进此代码的机会。

    ps 看来我在 SO 上为这款游戏做出了很多贡献 :) 你应该在它发布时给我一个促销代码 :D

    【讨论】:

    • 我不得不将行 let node = contact.bodyA.node 更改为 let node = contact.bodyB.node,但之后它起作用了。非常感谢您的帮助!
    • @kriskendall99 你是对的,这就是为什么你应该反对代码重复,只是为了避免这种愚蠢的复制粘贴错误:)
    • 现在,我正在尝试添加另一个具有基本相同行为的传感器。我试图在更改类别时复制并粘贴代码,但这不起作用。我已将不成功的代码附加到我的问题中。我在这里做错了什么?
    • 您明白在这种带有多个对象的设置中只会处理一个联系人吗?所以如果虫子被气泡碰到了,只有气泡会被移除,但虫子会留下来等等。我认为你需要深入了解碰撞逻辑并了解它是如何工作的,不了解你总会有这样的错误。
    • 我想你可能误解了我的情况。玩家和蠕虫在碰撞,而不是气泡和蠕虫。
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多