繁体   English   中英

removeFromParent()在SpriteKit中不起作用

[英]removeFromParent() Doesn't Work in SpriteKit

我的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的回答,我的气泡精灵现在可以按预期的方式运行。 但是,我试图将相同的功能应用于另一个Sprite节点,并且仅仅复制他的代码将不会产生相同的效果。 我该怎么办? 这是新的代码:

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()
    }

您将bubbleDuplicate和bubble作为全局变量使用,并对它们调用removeFromParent,因此将仅删除最后生成的bubble和bubbleDuplicate。 如您所见,这不是正确的方法。 您应该采用contact方法中需要从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM