Swift / SceneKit-创建菜单 /等级选择游戏场景的最佳实践



我是iOS级别开发的新手,目前正在尝试创建我的第一个SceneKit游戏 - 但是,我不确定我应该使用哪种方法来创建" non -3D"菜单,级别选择页面,设置等页面等页面

我目前有一个GameViewController,并且我使用带有Overlaysksene的空scnscene显示我的SpriteKit菜单。单击菜单中的"播放"按钮后,我过渡到另一个空的SCNScene,我想在其中显示级别列表。我应该再次使用ovelayskscene,这是正确的方法吗?

我还注意到,即使我设置了scnview.overlayskscene = nil,然后在过渡到levelScene之前,如果我在PLA按钮上一个位置的位置点击,则在覆盖层中的nodepressed中仍然包含Playbutton Node ..

请原谅我的新秀问题,到目前为止,我还没有找到这样的情况。

到目前为止我的代码:

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()
        }
    }
}
}

"叠加层中的nodepressed仍然包含playbutton节点..."

您将指针设置为"覆盖场景"为零,在Touchesbegan中,您可以从叠加层场景中获得位置,但是随后您在"控制"属性中存储的Skscene上使用了Atpoint,因此它仍然可以找到播放按钮。因此

也就是说,我一般不知道其他人认为什么是最佳实践,但是就个人而言,一旦我不仅需要几个按钮,我就停止使用SpriteKit覆盖场景,而是使用常规的Uikit元素来构建菜单在Scnview的顶部。

最新更新