swift - 重复循环中的 "Attemped to add a SKNode which already has a parent:"。任何简单的解决方法?

标签 swift sprite-kit

我是编程新手。我正在尝试动态地堆积随机 block ,直到它到达上部框架。但似乎 swift 不让我这样做。请问我错过了什么吗?欢迎任何意见。

let blocks =[block1,block2,block3,block4,block5,block6,block7,block8,block9,block10,block11,block12]


    var block:SKSpriteNode!

    let blockX:Double = 0.0
    var blockY:Double = -(self.size.height/2)

    repeat{
        block = blocks.randomBlock()
        block.zPosition = 2
        block.position = CGPoint(x:blockX, y:blockY)


        block.size.height = 50
        block.size.width = 50
        self.addChild(block)

        blockY += 50


    } while( block.position.y < self.size.height)

extension Array { 
    func randomBlock()-> Element { 
       let randint = Int(arc4random_uniform(UInt32(self.count))) 
       return self[randint] 
    } 
}

最佳答案

您需要以某种方式跟踪哪些 block 已被选中,并确保它们不会再次被选中。下面的方法使用数组存储所选 block 的索引,然后使用递归查找循环,直到找到未使用的匹配项。

private var usedBlocks = [Int]()

func randomBlock() -> Int {

    guard usedBlocks.count != blocks.count else { return -1 }

    let random = Int(arc4random_uniform(UInt32(blocks.count)))

    if usedBlocks.contains(random) {
        return randomBlock()
    }
    usedBlocks.append(random)

    return random
}

在你的循环中将你的初始化程序更改为

let index = randomBlock()

if index > -1 {
    block = blocks[index]
    block.zPosition = 2
    block.position = CGPoint(x:blockX, y:blockY)
}

请记住,如果您重新启动游戏或开始新的关卡等,您必须清除 usedBlocks 中的所有对象

usedBlocks.removeAll()

关于swift - 重复循环中的 "Attemped to add a SKNode which already has a parent:"。任何简单的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751269/

相关文章:

swift - 在 Swift 中比较 "versioning"字符串的最佳方法

while 循环中的 Swift 可选绑定(bind)

swift - 从 autoID 节点中检索值

ios - 将 SKSpriteNode 保持在屏幕范围内

ios - XCode 6.3 错误 : Unknown class in Interface Builder file

ios - 如何为按钮点击编写单元测试?

ios - 我如何制作五彩纸屑?

ios - 为什么这个 SKPhysicsJointPin 不能将这两个 Sprite 放在一起?

swift - 将 SKSpriteNode 移动到触摸方向

ios - 在节点中使用 sprite kit 问题进行游戏开发?