簡體   English   中英

實例化類不起作用-Swift

[英]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
    }
}

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. 在多維數據集初始化程序中,將復制導入的多維數據集參數。 現在,節點“多維數據集”是該參數的副本。

  3. 仍然在初始化程序中,創建了一個新節點(稱為“節點”)。

  4. 仍在初始化程序中,將“多維數據集”(副本)添加到“節點”。 在這一點上,多維數據集是“節點”的子節點,但是多維數據集實例本身(它一個節點)沒有子節點。

  5. 初始化完成。

  6. 新創建的Cube實例將添加到場景的根節點。

此時,有四個相關的節點:

  • 根節點,
  • 多維數據集實例節點
  • 該節點稱為“節點”
  • 導入的副本

多維數據集實例節點是根節點的子級。 導入的副本是“節點”節點的子級。 但是,“節點”節點沒有父節點。

解決方法是通過在“多維數據集”實例初始化程序內部將“ node”節點添加到self來確保所有節點都屬於層次結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM