【发布时间】:2016-08-22 17:16:39
【问题描述】:
当我开发基于 SpriteKit 的游戏时,我有一个关于视图控制器以及如何以简洁的方式处理它们的一般性问题。
到目前为止我做了什么:
- 故事板仅用于定义视图控制器
- SKScene 由 presentScene 在每个视图控制器(Home、LevelSelection、Game)中呈现
- 在每个视图控制器中,我调用 performSegueWithIdentifier 并使用我在视图控制器之间的情节提要中定义的标识符
- 我在 SKScene 上使用 SKSpritenode 等以编程方式显示的所有内容
- 在故事板上,我只有定义了 segue 关系和标识符的视图控制器
- 我在 viewDidDisappear 中所做的所有事情都是因为它似乎是正确取消我的 SKScene 的唯一方法
我的问题是:
- 每次我切换到另一个视图时,我的内存都会增加,因为视图控制器被重新初始化,旧的控制器一直留在堆栈中
- 我不清楚如何处理视图控制器之间的 segue,在一些教程页面上我看到人们使用导航控制器,其他人正在使用某些视图控制器的强引用并在视图控制器中使用单例模式为了决定是初始化视图控制器还是只显示它
- 我的视图控制器没有取消初始化,我知道我的主视图不能,因为它是初始视图,但既然 ios 无论如何都会重新初始化它,为什么不卸载它呢?
基于 Swift 的游戏使用 SpriteKit 处理视图控制器的正确方法是什么?下面你可以看到我的初始视图控制器(主页)显示了一个带有简单播放按钮的 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")
}
}
【问题讨论】:
-
对我来说听起来像是糟糕的关卡设计,除非您计划将多个视图用于多种用途,坚持使用 1 个视图控制器和 1 个 skview,并仅使用 presentScene 在不同场景之间跳转
-
一如既往,你是堆栈溢出的主人。当我见到你时,总是正确的建议。
-
有趣,我只是在做我从所有教程甚至下载的应用程序模板中看到的内容。我总是看到多个视图,例如 Home、Settings、GameScreen 和 GameOver。只用一个 ViewController 处理所有事情是不是太难了? @Knight0fDragon 你能告诉我一些我可以读到这个想法的网站吗?
-
不幸的是我没有,但是不,在 1 个视图控制器中处理所有事情并不难。我能想到的最简单的方法是您的视图控制器,您的视图几乎是 Sprite Kit 环境的外壳,您应该将场景文件视为您的“视图控制器”。唯一的问题是你还没有一个很好的 GUI 设置来处理多个场景,就像你对故事板所做的那样。也许在 XCode 的未来更新中,场景编辑器会允许它。
-
你没看我的回答吗?
标签: ios swift uiviewcontroller sprite-kit