我在开发基于SpriteKit的游戏时对视图控制器以及如何以一种干净的方式处理它们有一个一般性的问题。
我到目前为止所做的:
我的问题是:
使用SpriteKit处理视图控制器的基于Swift的游戏的正确方法是什么?在下面,您可以看到我的初始视图控制器(主页),其中显示了一个带有简单播放按钮的SKScene,该按钮调用play()函数以选择关卡选择
import UIKit import SpriteKit class Home : UIViewController { private var scene : HomeScene! override func viewDidLoad() { print(self) super.viewDidLoad() self.scene = HomeScene(size: view.bounds.size) self.scene.scaleMode = .ResizeFill let skView = view as! SKView skView.showsFPS = true skView.showsNodeCount = true skView.ignoresSiblingOrder = true NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(play), name: Constants.Events.Home.play, object: nil) skView.presentScene(self.scene) } override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) let v = view as! SKView self.scene.dispose() v.presentScene(nil) NSNotificationCenter.defaultCenter().removeObserver(self) self.scene = nil self.view = nil print("home did disappear") } func play() { self.performSegueWithIdentifier("home_to_levelselection", sender: nil) } deinit { print("Home_VC deinit") } }
要呈现3个场景,您的方法似乎非常复杂。它不是您应该为SpriteKit游戏做的,实际上只需要1个视图控制器(GameViewController)。
从GameViewController(例如HomeScene)加载您的第一个场景,仅此而已。直接在HomeScene中创建playButton和其他UI。将SpriteKit API用于您的UI(SKLabelNodes,SKNodes,SKSpriteNodes等)。
您绝对不应在SpriteKit中真正使用UIKit(UIButtons,UILabels)。对此有一些例外,例如可能将UICollectionViews用于大量级别的选择菜单,但基本的UI应该使用SpriteKit API完成。
Google上有很多教程,介绍如何创建Sprite Kit按钮,如何使用SKLabelNodes等。Xcode具有SpriteKit级别编辑器,因此您可以在视觉上完成类似于故事板的所有操作。
从HomeScene过渡到LevelSelect场景,再到GameScene,反之亦然。它超级容易做到。
/// Home Scene class HomeScene: SKScene { ... func loadLevelSelectScene() { // Way 1 // code only, no XCode/SpriteKit visual level editor used let scene = LevelSelectScene(size: self.size) // same size as current scene // Way 2 // with xCode/SpriteKit visual level editor // fileNamed is the LevelSelectScene.sks you need to create that goes with your LevelSelectScene class. guard let scene = LevelSelectScene(fileNamed: "LevelSelectScene") else { return } let transition = SKTransition.SomeTransitionYouLike view?.presentScene(scene, withTransition: transition) } } /// Level Select Scene class LevelSelectScene: SKScene { .... func loadGameScene() { // Way 1 // code only, no XCode/SpriteKit visual level editor used let scene = GameScene(size: self.size) // same size as current scene // Way 2 // with xCode/SpriteKit visual level editor // fileNamed is the GameScene.sks you need to create that goes with your GameScene class. guard let scene = GameScene(fileNamed: "GameScene") else { return } let transition = SKTransition.SomeTransitionYouLike view?.presentScene(scene, withTransition: transition) } } /// Game Scene class GameScene: SKScene { .... }
我强烈建议您使用情节提要和ViewController方法,并仅使用不同的SKScenes和1个GameViewController。
希望这可以帮助