实例化 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
}
}
在Cube
的init
中创建的节点没有添加为它的子节点。
我已经简化了下面的代码来说明问题。
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
}
}
对于每个 运行 循环,都会发生这种情况。
新建一个Cube实例,传入importedCube1
在 Cube 初始值设定项中,导入的 cube 参数被复制。节点 "cube" 现在是参数的副本。
仍在初始化程序中,创建了一个新节点(称为"node")。
还在初始化中,"cube"(复制)被添加到"node"。此时cube是"node"的子节点,但是Cube实例本身(是一个节点)没有子节点
初始化完成。
新创建的Cube实例添加到场景的根节点。
此时有四个相关节点:
- 根节点,
- 立方体实例节点
- 名为"node"
的节点
- 导入的副本
多维数据集实例节点是根节点的子节点。导入的副本是 "node" 节点的子节点。但是,"node" 节点没有父节点。
解决方法是通过将 "node" 节点添加到 Cube 实例初始化程序中的 self
来确保所有节点都是层次结构的一部分。
我在我的主 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
}
}
在Cube
的init
中创建的节点没有添加为它的子节点。
我已经简化了下面的代码来说明问题。
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
}
}
对于每个 运行 循环,都会发生这种情况。
新建一个Cube实例,传入importedCube1
在 Cube 初始值设定项中,导入的 cube 参数被复制。节点 "cube" 现在是参数的副本。
仍在初始化程序中,创建了一个新节点(称为"node")。
还在初始化中,"cube"(复制)被添加到"node"。此时cube是"node"的子节点,但是Cube实例本身(是一个节点)没有子节点
初始化完成。
新创建的Cube实例添加到场景的根节点。
此时有四个相关节点:
- 根节点,
- 立方体实例节点
- 名为"node" 的节点
- 导入的副本
多维数据集实例节点是根节点的子节点。导入的副本是 "node" 节点的子节点。但是,"node" 节点没有父节点。
解决方法是通过将 "node" 节点添加到 Cube 实例初始化程序中的 self
来确保所有节点都是层次结构的一部分。