我正在Xcode 8 Sprite-kit中构建游戏,并且具有不同的级别,但是当加载下一个级别的场景时,第一个级别的代码仍在运行。所有级别都有自己的快速文件,其名称与各自的场景相同。如何运行用于不同场景的代码?
这是改变水平的功能
class func level(_ levelNumber: Int) -> GameScene?
{
guard let scene = GameScene(fileNamed: "Level_\(levelNumber)") else
{
return nil
}
scene.scaleMode = .aspectFit
return scene
}
这是我用来更改级别的代码:
guard let scene = GameScene.level(currentScene) else
{
print("Level \(self.currentLevel+1) is missing?")
return
}
scene.scaleMode = .aspectFit
view.presentScene(scene)
最佳答案
就个人而言,我的处理方式略有不同。
我喜欢在“场景编辑器”(Scene Editor)中制作关卡文件,这使它们的布局非常快。
我将所有核心游戏引擎内容都放入了GameScene.swift和GameScene.sks文件中(例如gameHUD,玩家,得分,暂停...等等等等)
然后,我分别创建我的关卡文件,如Level1.sks,Level2.sks等。但是它们将是Level类型的类,因此您不必重复重复每个Level.sks在所有关卡上通用的通用内容。文件。
然后,我加载GameScene文件并处理所有适用于所有级别的对象。
然后我加载我的水平。重要的是要注意,当这样做并为Levels和GameScene创建单独的sks文件时,在加载对象时必须将其从Level文件移动到GameScene。
func createLevel(levelID: Int) {
if let levelNode = SKReferenceNode(fileNamed: "Level\(levelID)") {
if let background = levelNode.childNode(withName: "backgroundTiles") as? SKTileMapNode {
background.move(toParent: self)
}
if let water = levelNode.childNode(withName: "waterTiles") as? SKTileMapNode {
water.move(toParent: self)
}
if let badGuy = levelNode.childNode(withName: "badGuy") as? SKSpriteNode {
self.badGuy = badGuy
badGuy.move(toParent: self)
}
}
}