首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift/SceneKit -创建游戏菜单/级别选择场景的最佳实践

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

Stack Overflow用户
提问于 2017-09-29 05:47:50
回答 1查看 1.1K关注 0票数 2

我对iOS级别的开发非常陌生,目前正在尝试创建我的第一个SceneKit游戏--但是,我不确定我应该使用什么方法来创建“非3D”页面,比如菜单、级别选择页面、设置等等。

我现在有一个GameViewController,我使用带overlaySKScene的空SCNScene来显示SpriteKit菜单。单击菜单中的play按钮,我会切换到另一个空的SCNScene,在那里我想显示级别列表。我是否应该再次使用ovelaySKSCene,这是正确的方法吗?

我还注意到,即使在转换到levelScene之前设置了levelScene=0,如果我点击以前放置pla按钮的位置,overlayScene中的nodePressed仍然包含playButton节点。

请原谅我的新秀问题,到目前为止,我还没有找到这类场景的好例子可供学习。

到目前为止我的代码是:

代码语言:javascript
复制
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()
        }

    }

}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 17:17:41

“nodePressed in overlayScene仍然包含playButton节点……”

您正在将指向覆盖场景的指针设置为零,并且在touchesbegan中,您从覆盖场景中获取位置,但是在存储在“controls”属性中的淫秽场景中使用atPoint,因此它仍然可以找到play按钮。因此,在touchesbegan中将self.controls替换为scnView.overlaySKScene。

尽管如此,我不知道其他人通常认为什么是最佳实践,但就我个人而言,一旦我需要的不仅仅是几个按钮,我就不再使用spritekit覆盖场景,而是使用常规的UIKit元素在SCNView之上构建菜单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46482480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档