[英]Instantiating class doesnt work - swift
我在主類中有一個簡單的函數調用,可以從我的Cube類創建一些實例,但似乎無法將我的實例添加到場景中。 我試圖在我的Cube類中返回self,但是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實例將添加到場景的根節點。
此時,有四個相關的節點:
多維數據集實例節點是根節點的子級。 導入的副本是“節點”節點的子級。 但是,“節點”節點沒有父節點。
解決方法是通過在“多維數據集”實例初始化程序內部將“ node”節點添加到self
來確保所有節點都屬於層次結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.