2017-09-29 2 views
2

iOS 수준 개발이 처음이고 현재 첫 번째 SceneKit 게임을 만들려고 노력하고 있습니다. 그러나 어떤 방법을 사용해야하는지 잘 모르겠습니다. 메뉴, 레벨 선택 페이지, 설정 등과 같은 "non-3D"페이지를 만들 수 있습니다.Swift/SceneKit - 게임의 메뉴/레벨 선택 장면을 만들기위한 모범 사례

현재 GameViewController가 하나 있고 overlaySKScene과 함께 빈 SCNScene을 사용하여 SpriteKit 메뉴를 표시합니다. 메뉴에서 재생 버튼을 클릭하면 다른 비어있는 SCNScene으로 이동하여 레벨 목록을 표시하려고합니다. 다시 ovelaySKSCene을 사용해야합니까? 올바른 방법입니까?

는 또한 .. 내가 괞 찮아 버튼의 이전 배치의 자리에 눌러 경우, levelScene으로 전환하기 전에 scnView.overlaySKScene = 전무를 설정 한 경우에도, 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() 
     } 

    } 

} 

} 

답변

1

는 "overlayScene의 nodePressed 여전히 playButton으로 노드를 포함 ..."

당신은 touchesbegan에서 전무로 오버레이 장면에 대한 포인터를 설정하고 당신은 오버레이 장면에서 위치를 가져온 다음 "controls"속성에 저장된 skscene에서 atPoint를 사용하여 여전히 재생 버튼을 찾습니다. 따라서 self.controls를 touchesbegan의 scnView.overlaySKScene으로 대체하십시오.

그렇다면 일반적으로 다른 사람들이 모범 사례로 생각하지는 않지만 개인적으로는 몇 개의 버튼 이상을 필요로 할 때 spritekit 오버레이 장면을 사용하지 않고 대신 일반 UIKit 요소를 사용하여 빌드합니다 SCNView 상단의 메뉴.

+0

의견을 보내 주셔서 감사합니다. "SCNView 위에 UIKit 요소"가 무엇을 의미하는지 명확하게 설명해 주시겠습니까? 마지막으로 스토리 보드를 사용하여 다른 viewcontroller를 만들고 UIKit 요소로 내 메뉴/레벨 선택 페이지를 디자인하고 게임 컨트롤러에서 /로 나가기를 결정했습니다. 이는 접근 방식과 비슷합니까? –

+1

내가하는 일은 XIb 파일에 원하는 요소가있는 UIView를 만든 다음 SCNView 자체의 일반 하위 뷰로 추가하는 것입니다. 따라서 3D 장면을 배경으로 사용할 수 있으며 그 위에 일반 UIKit 요소를 사용할 수 있습니다. 메뉴 장면이 완전히 2D면 그렇다면 여전히 오버레이 씬을 피해야합니다. – Xartec