我正在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)
        }
    }
}

10-02 08:44