ios - 我正在尝试将命令从 SKScene(SpriteKit) 传递到 SCNScene(SceneKit)
问题描述
我想单击一个按钮来生成一个 3D 对象。我将一个 SpritKit 场景覆盖到一个 SceneKit 场景上,以便在我的界面中使用 SKNodes。但由于某种原因,该函数没有被调用,其余代码似乎正在工作。我想知道这是什么原因,以及是否有另一种调用此函数的方法
这是我试图传递的功能。
func setupDice() {
var diceNode: SCNNode!
let size: CGFloat = 1.5
let diceGeometry = SCNBox(width: size, height: size, length: size, chamferRadius: 0)
diceGeometry.materials.removeFirst()
for i in 1...6 {
let diceMaterial = SCNMaterial()
diceMaterial.locksAmbientWithDiffuse = true
diceMaterial.diffuse.contents = UIImage(named: "x\(i)")?.xFlipped
diceMaterial.blendMode = .multiply
diceGeometry.materials.append(diceMaterial)
}
diceNode = SCNNode(geometry: diceGeometry)
diceNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
diceNode.physicsBody?.restitution = 1
diceNode.physicsBody?.mass = 1
diceNode.physicsBody?.categoryBitMask = 1
diceNode.physicsBody?.collisionBitMask = 2
diceNode.physicsBody?.applyTorque(SCNVector4(x: randomTorqueForce(),
y: randomTorqueForce(),
z: randomTorqueForce(),
w: randomTorqueForce()), asImpulse: true)
self.rootNode.addChildNode(diceNode)
}
这是我在 SpriteKit 场景中调用函数的地方
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
if touch == touches.first {
if playButtom.contains(touch.location(in: self)){
mainScene.setupDice()
}
}
}
}
这是我的 GameViewController 的正确状态
class GameViewController: UIViewController {
var sceneView: SCNView!
var spriteScene: OverlayScene!
override func viewDidLoad() {
super.viewDidLoad()
//setupTest()
self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
self.sceneView.scene = MainScene()
spriteScene = OverlayScene(size: view.bounds.size)
sceneView.backgroundColor = UIColor.white
sceneView.overlaySKScene = spriteScene
sceneView.allowsCameraControl = true
sceneView.isPlaying = true
self.view.addSubview(self.sceneView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
解决方案
可能是因为您没有mainScene
在OverlayScene
. 像这样的东西应该有效:
class GameViewController: UIViewController {
var sceneView: SCNView!
var spriteScene: OverlayScene!
override func viewDidLoad() {
super.viewDidLoad()
//setupTest()
self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
let mainScene = MainScene()
self.sceneView.scene = mainScene
let overlayScene = OverlayScene(size: view.bounds.size)
overlayScene.mainScene = mainScene
spriteScene = overlayScene
sceneView.backgroundColor = UIColor.white
sceneView.overlaySKScene = spriteScene
sceneView.allowsCameraControl = true
sceneView.isPlaying = true
self.view.addSubview(self.sceneView)
}
推荐阅读
- scala - Spark将Json中的列字段类型转换为多行或嵌套行
- python - i 和 j 之间的距离由分隔两个名词短语的句子数
- javascript - “请求动画帧”。在“requestAnimationFrame”中忽略了点击触发器
- javascript - 如何在 Angular 6 中使用 adobe CQ i18n?
- android - 即使应用程序关闭,也在后台运行 Dart 和 Flutter 中的定期任务
- sql - Creating A Trigger When Insert Is Already Done
- php - MYSQL + PHP:可以将一个表中的结果与数组提供的数据合并吗?
- git - Git - 将另一个远程分支拉入我的本地分支
- vue.js - 在 Vue Js 中创建交互时间线
- android - 如何使用卡片视图中文本视图的值更新评分栏?