如何在 GameViewController.swift 中加载不同于 GameScene.swift 的 spritekit 文件?
How can I load a spritekit file different than GameScene.swift in my GameViewController.swift?
在GameViewController.swift中,我找到了这一行
if let scene = GameScene(fileNamed:"GameScene") {
而且我一直认为,如果我想加载 GameScene.swift 以外的内容,我只需将 "GameScene" 更改为 "LandingPage",一切都会正常进行。然而,正如我最近发现的那样,"GameScene" 这里实际上指的是 GameScene.sks 而不是 swift 文件。
我想制作一款包含多个关卡的游戏,每个关卡都写在自己的 swift 文件中。我要去哪里/如何从 level1.swift 移动到 level2.swift?
您可以在 Custom Class Inspector 中为每个场景文件指定自定义 class 名称。这是“实用程序”窗格中最右边的选项卡。
载入sks文件时载入自定义class(必须是SKScene的子class)。
如果你在一个场景中,比如关卡选择场景,比方说LevelSelectionScene.swift
,你可以通过SKView
的-presentScene:transition:
方法进入另一个场景。
class LevelSelectionScene: SKScene {
override func didMoveToView(view: SKView) { /* ... */}
func selectLevel(level: Int) {
let fadeTransition = SKTransition.fadeWithDuration(0.3)
if let selectedLevel = createLevelSceneWithLevel(level) {
self.view?.presentScene(selectedLevel, transition: fadeTransition)
}
}
// Not a good idea if you progressively adding new levels,
// it's totally depend on how you gonna organize your levels.
// Since its level input is not arbitrary, the output of this
// rarely nil, if it does, it must be the developer mistake.
func createLevelSceneWithLevel(level: Int) -> SKScene? {
let levelScene: SKScene?
switch level {
case 1: levelScene = Level1()
case 2: levelScene = Level2()
default: levelScene = nil
}
return levelScene
}
}
正如上面有人所说的那样 "fileNamed: "GameScene" "
if let scene = GameScene(fileNamed:"GameScene") {
引用 GameScene.sks 文件,相当于游戏的故事板。
如果您创建一个新的 SKScene class 并尝试以这种方式加载它,无论是从另一个 SKScene 还是 gameViewController 它将无法工作,因为它找不到相应的 sks 文件。
我不是 100% 确定如何创建新的 sks 文件,因为我没有在我的游戏中使用它。
如果您只想加载您创建的新场景,您可以在 gameViewController 中使用此代码
let skView = self.view as! SKView
let scene = NewScene(size: skView.bounds.size)
skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
如果你想从 SKScene 加载另一个场景 class 它基本上是相同的代码
let newScene = NewScene(size: self.size) //size of current scene
let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5) // use transition between 2 SKScenes
let skView = self.view as! SKView
skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
newScene.scaleMode = .AspectFill
skView.presentScene(newScene, transition: transition)
或更简洁的版本
let newScene = NewScene(size: self.size)
let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5)
newScene.scaleMode = SKSceneScaleMode.AspectFill
self.view?.presentScene(newScene, transition: transition)
在GameViewController.swift中,我找到了这一行
if let scene = GameScene(fileNamed:"GameScene") {
而且我一直认为,如果我想加载 GameScene.swift 以外的内容,我只需将 "GameScene" 更改为 "LandingPage",一切都会正常进行。然而,正如我最近发现的那样,"GameScene" 这里实际上指的是 GameScene.sks 而不是 swift 文件。
我想制作一款包含多个关卡的游戏,每个关卡都写在自己的 swift 文件中。我要去哪里/如何从 level1.swift 移动到 level2.swift?
您可以在 Custom Class Inspector 中为每个场景文件指定自定义 class 名称。这是“实用程序”窗格中最右边的选项卡。
载入sks文件时载入自定义class(必须是SKScene的子class)。
如果你在一个场景中,比如关卡选择场景,比方说LevelSelectionScene.swift
,你可以通过SKView
的-presentScene:transition:
方法进入另一个场景。
class LevelSelectionScene: SKScene {
override func didMoveToView(view: SKView) { /* ... */}
func selectLevel(level: Int) {
let fadeTransition = SKTransition.fadeWithDuration(0.3)
if let selectedLevel = createLevelSceneWithLevel(level) {
self.view?.presentScene(selectedLevel, transition: fadeTransition)
}
}
// Not a good idea if you progressively adding new levels,
// it's totally depend on how you gonna organize your levels.
// Since its level input is not arbitrary, the output of this
// rarely nil, if it does, it must be the developer mistake.
func createLevelSceneWithLevel(level: Int) -> SKScene? {
let levelScene: SKScene?
switch level {
case 1: levelScene = Level1()
case 2: levelScene = Level2()
default: levelScene = nil
}
return levelScene
}
}
正如上面有人所说的那样 "fileNamed: "GameScene" "
if let scene = GameScene(fileNamed:"GameScene") {
引用 GameScene.sks 文件,相当于游戏的故事板。
如果您创建一个新的 SKScene class 并尝试以这种方式加载它,无论是从另一个 SKScene 还是 gameViewController 它将无法工作,因为它找不到相应的 sks 文件。
我不是 100% 确定如何创建新的 sks 文件,因为我没有在我的游戏中使用它。
如果您只想加载您创建的新场景,您可以在 gameViewController 中使用此代码
let skView = self.view as! SKView
let scene = NewScene(size: skView.bounds.size)
skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
如果你想从 SKScene 加载另一个场景 class 它基本上是相同的代码
let newScene = NewScene(size: self.size) //size of current scene
let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5) // use transition between 2 SKScenes
let skView = self.view as! SKView
skView.ignoresSiblingOrder = true
skView.multipleTouchEnabled = true
newScene.scaleMode = .AspectFill
skView.presentScene(newScene, transition: transition)
或更简洁的版本
let newScene = NewScene(size: self.size)
let transition = SKTransition.doorsCloseHorizontalWithDuration(0.5)
newScene.scaleMode = SKSceneScaleMode.AspectFill
self.view?.presentScene(newScene, transition: transition)