gpt4 book ai didi

ios - Swift:如何处理我的游戏的 View Controller

转载 作者:搜寻专家 更新时间:2023-11-01 06:18:29 25 4
gpt4 key购买 nike

我有一个关于 View Controller 的一般性问题,以及在开发基于 SpriteKit 的游戏时如何以干净的方式处理它们。

到目前为止我做了什么:

  • 仅将 Storyboard用于定义 View Controller
  • SKScene 由 presentScene 在每个 View Controller (Home、LevelSelection、Game)中呈现
  • 在每个 View Controller 中,我调用 performSegueWithIdentifier,并使用我在 View Controller 之间的 Storyboard中定义的标识符
  • 我在 SKScene 上使用 SKSpritenode 等以编程方式显示的所有内容
  • 在 Storyboard上,我只有定义了 segue 关系和标识符的 View Controller
  • 我在 viewDidDisappear 中所做的所有事情都是因为它似乎是正确取消我的 SKScene 的唯一方法

我的问题是:

  • 每次我切换到另一个 View 时,我的内存就会增加,因为 View Controller 被重新初始化,旧的一直留在堆栈中
  • 我不清楚如何处理 View Controller 之间的 segue,在一些教程页面上我看到人们使用导航 Controller ,其他人正在使用某些 View Controller 的强引用并在 View Controller 中使用单例模式为了决定是初始化 View Controller 还是只显示它
  • 我的 View Controller 没有 deiniting,我知道我的 home view 不能,因为它是初始 View ,但既然 ios 正在重新初始化它,为什么不卸载它呢?

使用 SpriteKit 处理 View Controller 的基于 Swift 的游戏的正确方法是什么?下面你可以看到我的初始 View Controller (Home)显示了一个 SKScene 和一个简单的播放按钮,它调用 play() 函数来继续到 levelselection

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 个 View Controller (GameViewController)。

从 GameViewController(例如 HomeScene)加载您的第一个场景,仅此而已。直接在 HomeScene 中创建播放按钮和其他 UI。将 SpriteKit API 用于您的 UI(SKLabelNodes、SKNodes、SKSpriteNodes 等)。

你永远不应该在 SpriteKit 中真正使用 UIKit(UIButtons,UILabels)。这有一些异常(exception),比如可能将 UICollectionViews 用于大量级别选择菜单,但基本的 UI 应该使用 SpriteKit API 来完成。

Google 上有很多关于如何创建 Sprite 工具包按钮、如何使用 SKLabelNode 等的教程。Xcode 有一个 SpriteKit 关卡编辑器,所以你可以做所有视觉上类似于 Storyboard的事情。

比从 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 {
....
}

我强烈建议您从头开始使用 Storyboard和 ViewController 方法,只使用不同的 SKScenes 和 1 个 GameViewController。

希望对你有帮助

关于ios - Swift:如何处理我的游戏的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39085221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com