我在开发基于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。
希望这可以帮助
我想执行另一个视图控制器从注册,但当我这样做,边栏消失。有人帮忙吗? [ViewControllers][1]:https://i.stack.imgur.com/c6tsh.png
有没有办法在当前(子)中获取父VC的类名?我的'子'VC(推送)有两个'父',所以我想知道哪一个是当前的父?
这是我第一次在这里问问题,所以请原谅,如果它有错误/不是描述性的。 实际上,我是JavaScript的初学者,在制作控制台猜测游戏时,输出窗口中只是什么也没有(它支持报警和提示框)。代码如下: 很抱歉代码格式不正确:)
我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑
我需要修改我的代码,使它成为一个模型-视图-控制器。因为我是一个完全的编程新手,如果我诚实的话,我会头疼。任何帮助如何做到这一点将不胜感激。 *在一个牧场上有200只忙碌的绵羊。这群羊由95只白羊、60只黑羊和45只白黑羊组成。牧羊人现在想把它们分开,这样相应的羊毛就可以按颜色剪了。帮他写一个小脚本,这样他就可以更好地点他的羊了。请使用变量、数组、数学运算符和函数实现前三点。提示:为了更好地概述,
我有一组视图和一个注销按钮,它将用户注销并将他们带到第一个视图控制器(一个登录/注册屏幕)。我试着用模态表示来做这件事,但它破坏了我的导航,而且我不能使用pop到根视图控制器,因为它不是根视图控制器--我至少有2个导航控制器的深度。我怎么可能只显示第一个呢?我基本上需要它的行为,就好像应用程序刚刚重新启动。解开塞格会有什么帮助吗?谢谢