【发布时间】:2016-06-27 22:41:12
【问题描述】:
我正在尝试用 Swift 构建一个 SceneKit-App。这个 App 应该有一个 SpriteKit-Overlay。我的问题是,我可以从 ViewController 中的 SpriteKit 访问 LabelNode,但无法更改 SceneKit 中 Cube-Node 的位置值,尽管我可以访问该节点。因为我是新手,如果有人能指出我正确的方向,那就太好了。
class GameViewController: UIViewController {
var sceneView: SCNView!
var spriteScene: SpriteKitOverlay!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
self.sceneView.scene = SceneKitScene()
self.sceneView.backgroundColor = UIColor.brownColor()
self.view.addSubview(self.sceneView)
self.spriteScene = SpriteKitOverlay(size: self.view.bounds.size)
self.sceneView.overlaySKScene = self.spriteScene
SceneKitScene().cubeNode.position = SCNVector3(0,10,0)
spriteScene.labelTest.text = "Changed label"
print(SceneKitScene().cubeNode.position)
}
}
class SpriteKitOverlay: SKScene {
var labelTest: SKLabelNode!
override init(size: CGSize) {
super.init(size: size)
self.labelTest = SKLabelNode(text: "Label text")
self.labelTest.fontColor = UIColor.whiteColor()
self.labelTest.fontSize = 24
self.labelTest.position = CGPoint(x: size.width/2, y: size.height/2)
self.addChild(self.labelTest)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
class SceneKitScene: SCNScene {
var cubeNode: SCNNode!
var cameraNode: SCNNode!
var lightNode: SCNNode!
override init() {
super.init()
let cube = SCNBox(width: 3, height: 3, length: 3, chamferRadius: 0)
let cubeMaterial = SCNMaterial()
cubeMaterial.diffuse.contents = UIColor.blueColor()
cube.materials = [cubeMaterial]
self.cubeNode = SCNNode(geometry: cube)
self.cubeNode.position = SCNVector3(0,0,0)
self.cubeNode.runAction(SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 0.01, z: 0, duration: 1.0/60.0)))
let camera = SCNCamera()
camera.xFov = 60
camera.yFov = 60
let ambientLight = SCNLight()
ambientLight.type = SCNLightTypeAmbient
ambientLight.color = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
let cameraConstraint = SCNLookAtConstraint(target: self.cubeNode)
cameraConstraint.gimbalLockEnabled = true
self.cameraNode = SCNNode()
self.cameraNode.camera = camera
self.cameraNode.constraints = [cameraConstraint]
self.cameraNode.light = ambientLight
self.cameraNode.position = SCNVector3(x: 5, y: 5, z: 5)
let omniLight = SCNLight()
omniLight.type = SCNLightTypeOmni
self.lightNode = SCNNode()
self.lightNode.light = omniLight
self.lightNode.position = SCNVector3(x: -3, y: 5, z: 3)
self.rootNode.addChildNode(self.cubeNode)
self.rootNode.addChildNode(self.cameraNode)
self.rootNode.addChildNode(self.lightNode)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
【问题讨论】:
-
在相关说明中,请参阅 rickster 的回答,了解您是否应该继承
SCNScene:stackoverflow.com/a/34536248/2997825