2016-02-09 40 views
1

我在我的主类中创建了一些简单的函数来从我的Cube类创建一些实例,但我似乎无法将我的实例添加到我的场景中。我尝试在我的Cube类中返回自己,但Swift不会让我在init中执行此操作。实例化类不工作 - swift

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

回答

2

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. 一个新的立方体实例被创建,传递importedCube1

  2. 在多维数据集初始化,进口立方体参数被复制。节点“立方体”现在是参数的副本。

  3. 仍然在初始化器中创建一个新节点(称为“节点”)。

  4. 仍然在初始化器中,“立方体”(副本)被添加到“节点”。此时,cube是“node”的子节点,但Cube实例本身(其中是节点的)没有子节点。

  5. 初始化完成。

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

在这一点上有四个相关的节点:

  • 根节点,
  • 立方体实例节点
  • 称为 “节点”
  • 进口的拷贝节点

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

此修复程序旨在确保所有节点都是层次结构的一部分,方法是在多维数据集实例初始值设定项中将self添加到“节点”节点中。

+0

啊,在概念上这是非常有意义的,谢谢大卫,我会尽力回应你的问题,并尽快回复。谢谢。 – JeremyRaven

+0

非常好,工作。我从我的课中删除了额外的SCNNode,而是将孩子添加到自己。 – JeremyRaven