gpt4 book ai didi

swift - SceneKit 渲染器功能不能 Swift 工作?

转载 作者:可可西里 更新时间:2023-11-01 02:13:15 24 4
gpt4 key购买 nike

我目前正在使用 Swift 3 和 SceneKit。我的问题似乎是我的渲染器功能无法正常工作。我不知道我做错了什么。该程序运行但没有代码:func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) 似乎执行。

这是渲染器函数之前的代码。

导入 UIKit
导入 QuartzCore
导入 SceneKit

GameViewController 类:UIViewController、SCNSceneRendererDelegate{

    let scene = SCNScene()
let cameraNode = SCNNode()
var person = SCNNode()

let firstBox = SCNNode()

var goingLeft = Bool()

var tempBox = SCNNode()

var prevBoxNumber = Int()

var boxNumber = Int()

override func viewDidLoad() {
self.createScene()
}


func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {


let deleteBox = self.scene.rootNode.childNode(withName: "\(prevBoxNumber)", recursively: true)


if (deleteBox?.position.x)! > person.position.x + 1 || (deleteBox?.position.z)! > person.position.z + 1{


prevBoxNumber += 1
deleteBox?.removeFromParentNode()
createBox()


}


}

这是我的 creatBox() 函数:

   func createBox(){
tempBox = SCNNode(geometry: firstBox.geometry)
let previousBox = scene.rootNode.childNode(withName: "\(boxNumber)", recursively: true)
boxNumber += 1
tempBox.name = "\(boxNumber)"


let randomNumber = arc4random() % 2

switch randomNumber {
case 0:
tempBox.position = SCNVector3Make((previousBox?.position.x)! - firstBox.scale.x, (previousBox?.position.y)! , (previousBox?.position.z)!)
break
case 1:
tempBox.position = SCNVector3Make((previousBox?.position.x)! , (previousBox?.position.y)! , (previousBox?.position.z)! - firstBox.scale.z)
break
default:
break

}
self.scene.rootNode.addChildNode(tempBox)
}

这是我的 createScene()

 self.view.backgroundColor = UIColor.white
let sceneView = self.view as! SCNView
boxNumber = 0
prevBoxNumber = 0
sceneView.delegate? = self
sceneView.scene = scene
//Create Box
let firstBoxGeo = SCNBox(width: 1, height: 1.5, length: 1, chamferRadius: 0)
firstBox.geometry = firstBoxGeo
let boxMaterial = SCNMaterial()
boxMaterial.diffuse.contents = UIColor(red: 0.2, green: 0.8, blue: 0.9, alpha: 1.0)
firstBoxGeo.materials = [boxMaterial]
firstBox.position = SCNVector3Make(0, 0, 0)
scene.rootNode.addChildNode(firstBox)
firstBox.name = "\(boxNumber)"
for _ in 0...6 {
createBox()
}

如果我遗漏了什么或做错了什么,请告诉我。谢谢!

最佳答案

我还没有看到你的 createScene() 方法,所以我在这里猜测 :)

您是否已将 GameViewController 作为 SCNView 实例的委托(delegate)添加?

当你创建了你的SCNView,可能像这样:

let scnView = self.view as! SCNView

您需要将自己添加为代理人,如下所示:

scnView.delegate = self

然后你应该看到你的

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)

正在执行。

编辑(在看到您的createScene() 代码之后)

尝试改变:

sceneView.delegate? = self

sceneView.delegate = self

(省略 ?)

如果这样做,我可以看到您的 renderer 委托(delegate)方法至少被调用了两次。要使其继续被调用,您可以添加:

sceneView.isPlaying = true 

在您的 createScene() 方法中的某处,如果这是您的目标。

希望对你有帮助。

关于swift - SceneKit 渲染器功能不能 Swift 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40371896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com