实例化 class 不起作用 - swift

Instantiating class doesnt work - swift

我在我的主 class 中有一个简单的函数调用来从我的多维数据集 class 创建一些实例,但我似乎无法将我的实例添加到我的场景中。我尝试在我的 Cube class 中返回自我,但 Swift 不会让我在 init 中这样做。

func addCubeLoop() {
    for var i = 0; i <= 0; ++i {
        cube = Cube(num: i, importedCube: importedCube1)
        cubeArray.append(cube)
        theScene.rootNode.addChildNode(cubeArray[i])
    }
}


class Cube: SCNNode {

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    init(num: Int, importedCube: SCNNode) {
        let _scale: Float = 60
        let cube: SCNNode = importedCube.copy() as! SCNNode

        super.init()

        cube.scale = SCNVector3Make(_scale, _scale, _scale)
        let node = SCNNode()            
        node.addChildNode(cube)
        node.position = SCNVector3Make(5, 20, 3)
        let collisionBox = SCNBox(width: 5.0, height: 5.0, length: 5.0, chamferRadius: 0)
        node.physicsBody?.physicsShape = SCNPhysicsShape(geometry: collisionBox, options: nil)
        node.physicsBody = SCNPhysicsBody.dynamicBody()
        node.physicsBody?.mass = 0.1
        node.physicsBody?.restitution = 0.8
        node.physicsBody?.damping = 0.5
        node.name = "dice" + String(num)
        node.physicsBody?.allowsResting = true
    }
}

Cubeinit中创建的节点没有添加为它的子节点。

我已经简化了下面的代码来说明问题。

func addCubeLoop() {
    for /* loop */ {
        // 1. create cube
        cube = Cube(num: i, importedCube: importedCube1)
        // 6. add cube to the scene's root node
        theScene.rootNode.addChildNode(cubeArray[i])
    }
}


class Cube: SCNNode {
    init(importedCube: SCNNode) {
        // 2. copy importedCube 
        let cube: SCNNode = importedCube.copy() as! SCNNode
        // configure cube  
        // ...          

        // 3. create node
        let node = SCNNode() 
        // 4. add cube (the copy) to node
        node.addChildNode(cube)
        // configure node
        // ...

        // 5. End of init
    }
}

对于每个 运行 循环,都会发生这种情况。

  1. 新建一个Cube实例,传入importedCube1

  2. 在 Cube 初始值设定项中,导入的 cube 参数被复制。节点 "cube" 现在是参数的副本。

  3. 仍在初始化程序中,创建了一个新节点(称为"node")。

  4. 还在初始化中,"cube"(复制)被添加到"node"。此时cube是"node"的子节点,但是Cube实例本身(一个节点)没有子节点

  5. 初始化完成。

  6. 新创建的Cube实例添加到场景的根节点。

此时有四个相关节点:

  • 根节点,
  • 立方体实例节点
  • 名为"node"
  • 的节点
  • 导入的副本

多维数据集实例节点是根节点的子节点。导入的副本是 "node" 节点的子节点。但是,"node" 节点没有父节点。

解决方法是通过将 "node" 节点添加到 Cube 实例初始化程序中的 self 来确保所有节点都是层次结构的一部分。