我对iOS级别开发很新,目前正在尝试创建我的第一个SceneKit游戏 - 但是,我不确定应该使用什么方法来创建菜单,级别选择页面等“非3D”页面,设置等。
我目前有一个GameViewController,我使用带有overlaySKScene的空SCNScene来显示我的SpriteKit菜单。单击菜单中的播放按钮后,我将转换到另一个空的SCNScene,我想在其中显示级别列表。我应该再次使用ovelaySKSCene,这是正确的方法吗?
我也注意到即使我在转换到levelScene之前设置了scnView.overlaySKScene = nil,如果我点击上一个pla按钮位置的位置,overlayScene中的nodePressed仍然包含playButton节点..
请原谅我的新手问题,到目前为止,我还没有找到这种类型场景的好例子来学习。
到目前为止我的代码:
import UIKit
import QuartzCore
import SceneKit
import SpriteKit
class GameViewController: UIViewController {
var scnView: SCNView {
let scnView = view as! SCNView
scnView.backgroundColor = UIColor.init(displayP3Red: 0.98, green: 0.64, blue: 0.04, alpha: 1)
return scnView
}
var menuScene: SCNScene!
var levelsScene: SCNScene!
var ground: SCNNode!
var light: SCNNode!
var scnScene: SCNScene!
var cameraNode: SCNNode!
var brickNode: SCNNode!
var selectedBrickNode: SCNNode!
var bricksArray : [SCNNode] = []
var controls: SKScene!
var levels: SKScene!
override func viewDidLoad() {
super.viewDidLoad()
setupView()
showMenu()
setupCamera()
}
override var shouldAutorotate: Bool {
return true
}
override var prefersStatusBarHidden: Bool {
return true
}
func setupView() {
scnView.showsStatistics = true
scnView.allowsCameraControl = false
scnView.autoenablesDefaultLighting = true
}
func showMenu() {
menuScene = SCNScene( )
scnView.scene = menuScene
self.controls = Controls(size: self.view.bounds.size)
self.controls.isUserInteractionEnabled = false
scnView.overlaySKScene = self.controls
}
func showLevels(){
levelsScene = SCNScene()
self.levels = Levels(size: self.view.bounds.size)
self.levels.isUserInteractionEnabled = false
scnView.overlaySKScene = self.levels
let transition = SKTransition.push(with: .left, duration: 1.0)
self.scnView.present(levelsScene
, with: transition, incomingPointOfView: nil, completionHandler:nil)
}
func setupCamera(){
cameraNode = SCNNode()
let camera = SCNCamera()
camera.zFar = 10000
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 10, z: 20)
let constraint = SCNLookAtConstraint(target: ground)
constraint.isGimbalLockEnabled = true
cameraNode.constraints = [constraint]
let ambientLight = SCNLight()
ambientLight.color = UIColor.darkGray
ambientLight.type = SCNLight.LightType.ambient
cameraNode.light = ambientLight
menuScene.rootNode.addChildNode(cameraNode)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch began ")
for touch: UITouch in touches {
let location = touch.location(in: scnView.overlaySKScene!)
let nodePressed = self.controls.atPoint(location)
print(nodePressed.name)
if (nodePressed.name == "playButton") {
scnView.overlaySKScene = nil
showLevels()
}
}
}
}
答案 0 :(得分:1)
“overlayScene中的nodePressed仍包含playButton节点......”
您正在将覆盖场景的指针设置为nil,并且在touchesbegan中您从覆盖场景中获取位置,但是您在skscene上使用atPoint存储在“controls”属性中,因此它仍然可以找到播放按钮。所以用touchesbegan中的scnView.overlaySKScene替换self.controls。
那就是说,我不知道其他人一般被认为是最佳实践,但个人而言,一旦我需要的不仅仅是几个按钮,我就停止使用spritekit覆盖场景,而是使用常规的UIKit元素来构建菜单在SCNView之上。